带有编译错误的PL / SQL代码

时间:2017-05-24 00:43:32

标签: plsql

我有以下代码块。有人可以帮我纠正同样的问题。

CREATE OR REPLACE package body NMS.ResourceBindDistribute_withfile  is

v_date date :=sysdate ;
v_user varchar2(10) := 'NMS';

    procedure create_SIMDMLNK_new(v_SIMRANGE varchar2 , v_MSISDN varchar2,v_TECH varchar2) is

    v_SIM_count integer;
    v_dlink_dn_cnt integer;
    v_dlink_dn integer;
    v_counter integer;
    v_new_dn_cnt integer;
    v_free_count integer := 0;
    sm_count integer;
    ms_count integer;

    cursor sim_curr is 
    select sim from temp_SIM_MSISDN;

    cursor msisdn_curr is 
    select msidn from temp_SIM_MSISDN;


    /* Cursor to selecet SIM for linking*/
    cursor simcusrsor_3G (l_SIMRANGE varchar2) is
        select sm_id,SM_SERIALNUM from storage_medium where SM_SERIALNUM in
        (select SM_SERIALNUM from storage_medium 
        where SM_SERIALNUM = l_SIMRANGE and SM_STATUS='r' and SMC_ID in (1,2)
        minus
        (select SM_SERIALNUM from NMS.SIMDMSLNK where SM_SERIALNUM = l_SIMRANGE
        union
        select SM_SERIALNUM  from NMS.SIMULNK where SM_SERIALNUM = l_SIMRANGE));

     cursor simcusrsor_4G (l_SIMRANGE varchar2) is
        select sm_id,SM_SERIALNUM from storage_medium where SM_SERIALNUM in
        (select SM_SERIALNUM from storage_medium 
        where SM_SERIALNUM = l_SIMRANGE and SM_STATUS='r' and SMC_ID in (3)
        minus
        (select SM_SERIALNUM from NMS. SIMDMSLNK where SM_SERIALNUM = l_SIMRANGE
        union
        select SM_SERIALNUM  from NMS.SIMULNK where SM_SERIALNUM = l_SIMRANGE));

    type t_simcursor is table of simcusrsor_3G%rowtype index by PLS_INTEGER;

    v_simsoure t_simcursor;



        /* Cursor to select Dlinked MSISDN for linking with New SIM*/
     cursor dlinkdn_cur (l_MSISDN varchar2) is
     select distinct DN_ID,DN_NUM from NMS.SIMDMSLNK where DN_NUM = l_MSISDN and status='D';

     type t_dlinkdn_cur  is table of dlinkdn_cur %rowtype index by PLS_INTEGER;

     v_dlinkdn_cur_source  t_dlinkdn_cur ;

    /* Cursor to select new Dummy MSISDN for linking with New SIM*/
    cursor dummydn_cur (l_MSISDN varchar2) is
    select   distinct DN_ID, DN_NUM  from directory_number  where DN_NUM = l_MSISDN 
    and dn_status = 'f'  and evcode is null and rscode=2 and DN_TYPE=3
    minus
    select distinct DN_ID,DN_NUM from NMS.SIMDMSLNK where DN_NUM = l_MSISDN;

     type t_dummydn_cur is table of dummydn_cur%rowtype index by PLS_INTEGER;

     v_dummydn_source  t_dummydn_cur;

     type t_SIMDMSLNK is table of NMS.SIMDMSLNK%rowtype index by PLS_INTEGER;

     v_SIMDM_target  t_SIMDMSLNK;

     v_simdml_count PLS_INTEGER :=1;

     NO_SIM_WITH_RANGE exception;

     NO_DUMMY_DN_WITH_RANGE exception;

        BEGIN

            select count(1) into v_new_dn_cnt from 
            (select  distinct DN_NUM from directory_number where DN_NUM = v_MSISDN
            and dn_status = 'f'  and evcode is null and rscode=2 and DN_TYPE=3
            minus
           select distinct DN_NUM from NMS.SIMDMSLNK where DN_NUM = v_MSISDN );

           select count(distinct DN_NUM) into  v_dlink_dn from NMS.SIMDMSLNK where DN_NUM = v_MSISDN and status='D';

             if ( v_dlink_dn =0 and v_new_dn_cnt = 0)  then
                raise NO_DUMMY_DN_WITH_RANGE;
             end if; 

            v_free_count := v_new_dn_cnt + v_dlink_dn; 

         /*  Cusrsor opened Dlinked MSISDN, to assign first DLINKED MSISDN */

           BEGIN 
                open msisdn_curr;
                for i in msisdn_curr
                LOOP
                select count(*) into ms_count from directory_number where dn_num = i.msisdn;
                if
                ms_count > 0
                then
                open dlinkdn_cur (v_MSISDN);
                fetch dlinkdn_cur bulk collect into  v_dlinkdn_cur_source;
                IF v_dlinkdn_cur_source.count = 0 THEN
                RAISE NO_DATA_FOUND;
                ELSE
                 v_dlink_dn_cnt := v_dlinkdn_cur_source.count;
                DBMS_OUTPUT.PUT_LINE ( 'FIRST D-LINKED MSISDN ARE LINKED TO SIM.');     
                END IF;
           EXCEPTION 
           WHEN NO_DATA_FOUND THEN
           DBMS_OUTPUT.PUT_LINE ( 'NO FREE D-LINKED MSISDN ARE AVAILABLE, FREE DUMMY MSISDN WILL BE USED FOR ASSOSOIATION.');
           END IF;
           END LOOP;
           END;



            open sim_curr
            for i in sim_curr
            LOOP
            select count(*) into sm_count from storage_medium where sm_serialnum=i.sim;
            if 
            sm_count > 0
            then

           IF v_TECH = 3 THEN 

             open simcusrsor_3G (v_SIMRANGE);
             fetch simcusrsor_3G bulk collect into v_simsoure;
           END IF;

           IF  v_TECH = 4 THEN
             open simcusrsor_4G (v_SIMRANGE);
             fetch simcusrsor_4G bulk collect into v_simsoure;
           END IF;

             v_SIM_count := v_simsoure.count;

            IF v_SIM_count = 0 then
            raise NO_SIM_WITH_RANGE;
            END IF;
            END IF;
            END LOOP;
             /*  Cusrsor opened NEW DUMMY MSISDN, to assign  NEW DUMMY MSISDN */

               BEGIN
               open msisdn_curr;
                for i in msisdn_curr
                LOOP
                select count(*) into ms_count from directory_number where dn_num = i.msisdn;
                if
                ms_count > 0
                then
                open dummydn_cur (v_MSISDN);
                fetch dummydn_cur bulk collect into v_dummydn_source;
                IF v_dummydn_source.count = 0 THEN
                RAISE NO_DATA_FOUND;
                ELSE
                DBMS_OUTPUT.PUT_LINE ( 'NEW DUMMY MSISDN ARE LINKED TO SIM.');     
                END IF;
                EXCEPTION
                WHEN NO_DATA_FOUND THEN
                DBMS_OUTPUT.PUT_LINE ( 'NO NEW DUMMY MSISDN IS AVAILABL FOR ASSOSOIATION.');
                END IF;
                END LOOP;
                END;


           v_counter :=1;

            for l_sim_counter in v_simsoure.first .. v_simsoure.last 
            loop

                if  l_sim_counter = ( v_free_count) then
                    if l_sim_counter <=  v_dlink_dn_cnt then
                        v_SIMDM_target(v_simdml_count).DN_ID := v_dlinkdn_cur_source(l_sim_counter).DN_ID;
                        v_SIMDM_target(v_simdml_count).DN_NUM := v_dlinkdn_cur_source(l_sim_counter).DN_NUM;   
                        DELETE from NMS.SIMDMSLNK where DN_ID=v_dlinkdn_cur_source(l_sim_counter).DN_ID and STATUS='D';            
                    else
                        v_SIMDM_target(v_simdml_count).DN_ID := v_dummydn_source(v_counter).DN_ID;
                        v_SIMDM_target(v_simdml_count).DN_NUM := v_dummydn_source(v_counter).DN_NUM;
                        v_counter := v_counter +1 ;
                    end if;

                    v_SIMDM_target(v_simdml_count).SM_SERIALNUM := v_simsoure(l_sim_counter).SM_SERIALNUM;
                    v_SIMDM_target(v_simdml_count).SM_ID :=  v_simsoure(l_sim_counter).SM_ID;
                    v_SIMDM_target(v_simdml_count).USER_LASTMOD := v_user;
                    v_SIMDM_target(v_simdml_count).LAST_UPDATE := v_date;
                    v_SIMDM_target(v_simdml_count).STATUS := 'L';

                    exit;
                end if;                     

                if l_sim_counter <=  v_dlink_dn_cnt then
                 v_SIMDM_target(v_simdml_count).DN_ID := v_dlinkdn_cur_source(l_sim_counter).DN_ID;
                v_SIMDM_target(v_simdml_count).DN_NUM := v_dlinkdn_cur_source(l_sim_counter).DN_NUM; 
                DELETE from NMS.SIMDMSLNK where DN_ID=v_dlinkdn_cur_source(l_sim_counter).DN_ID and STATUS='D';            
                else
                 v_SIMDM_target(v_simdml_count).DN_ID := v_dummydn_source(v_counter).DN_ID;
                 v_SIMDM_target(v_simdml_count).DN_NUM := v_dummydn_source(v_counter).DN_NUM;
                 v_counter := v_counter +1 ;
                end if;

                v_SIMDM_target(v_simdml_count).SM_SERIALNUM := v_simsoure(l_sim_counter).SM_SERIALNUM;
                v_SIMDM_target(v_simdml_count).SM_ID :=  v_simsoure(l_sim_counter).SM_ID;
                v_SIMDM_target(v_simdml_count).USER_LASTMOD := v_user;
                v_SIMDM_target(v_simdml_count).LAST_UPDATE := v_date;
                v_SIMDM_target(v_simdml_count).STATUS := 'L';


                v_simdml_count := v_simdml_count+1;
            end loop;

            FORALL i IN v_SIMDM_target.FIRST .. v_SIMDM_target.LAST SAVE EXCEPTIONS
            INSERT INTO NMS.SIMDMSLNK
                 VALUES v_SIMDM_target (i);

            COMMIT;

          close dlinkdn_cur;
            close dummydn_cur;
            IF v_TECH =3 THEN
                close simcusrsor_3G;
            ELSE
                close simcusrsor_4G;
             END IF;

            DBMS_OUTPUT.PUT_LINE ( 'SIM & DUMMY MSISDN LINKING PROCESS IS COMPLETED SUCCESSFULLY.');

        EXCEPTION
        WHEN  NO_SIM_WITH_RANGE THEN
        DBMS_OUTPUT.PUT_LINE ( 'THERE ARE NO SIMS AVAILABLE FOR TECHNOLOGY WITH GIVEN RANGE = '||v_SIMRANGE);
        WHEN  NO_DUMMY_DN_WITH_RANGE THEN
        DBMS_OUTPUT.PUT_LINE ( 'THERE ARE NO DUMMY MSISDN AVAILABLE FOR GIVEN RANGE = '||v_MSISDN);
         WHEN OTHERS THEN
         DBMS_OUTPUT.put_line ('SQLCODE  : ' || SQLCODE);
        DBMS_OUTPUT.put_line ('ERROR MESSAGE : ' || SQLERRM);
        ROLLBACK;
        END create_SIMDMLNK;

    procedure create_REALDN (v_MSISDN varchar2) is
        v_DN_count integer;
        v_count integer;

        NO_DN_WITH_RANGE exception;

        DN_WITH_PREPROVISION exception;

    BEGIN

             select  count(DN_ID)  into  v_DN_count from NMS.SIMDMSLNK
            where  DN_NUM  = v_MSISDN;

             if v_DN_count > 0 then
                raise DN_WITH_PREPROVISION;
             end if;

             select count(1) into v_count from 
             (select DN_ID   from DIRECTORY_NUMBER 
             where DN_NUM = v_MSISDN
             MINUS
             select DN_ID  from NMS.REALDN
             where REAL_DN like v_MSISDN||'%');

             if v_count = 0 then
                raise NO_DN_WITH_RANGE;
             end if;


            insert into NMS.REALDN (DN_ID,REAL_DN,DN_TYPE,USER_LASTMOD,LAST_UPDATE,STATUS )
            select DN_ID,DN_NUM ,DN_TYPE,v_user,v_date,'L' from Directory_number where DN_ID in
             ((select DN_ID   from DIRECTORY_NUMBER 
             where DN_NUM = v_MSISDN and dn_type not in (1,2) and evcode is null
             MINUS
             select DN_ID from NMS.REALDN
             where REAL_DN = v_MSISDN));

            COMMIT;

            DBMS_OUTPUT.PUT_LINE ( 'REAL DIRECTORY NUMBER CREATION PROCESS IS COMPLETED SUCCESSFULLY.');

    EXCEPTION
        WHEN DN_WITH_PREPROVISION THEN
         DBMS_OUTPUT.PUT_LINE ( 'MSISDN RANGE IS WITH PREPROVISION POOL ' || v_MSISDN);
        WHEN  NO_DN_WITH_RANGE THEN
         DBMS_OUTPUT.PUT_LINE ( 'NO DN AVAILABLE WITH RANGE ' || v_MSISDN);
        WHEN OTHERS THEN
         DBMS_OUTPUT.put_line ('SQLCODE  : ' || SQLCODE);
        DBMS_OUTPUT.put_line ('ERROR MESSAGE : ' || SQLERRM);
        ROLLBACK;
    END create_REALDN;

     procedure create_FREESIM (v_SIMRANGE varchar2) is
        v_SIM_count integer;
        v_count integer;

        NO_SIM_WITH_RANGE exception;

    BEGIN

            select count(1) into v_count from 
            (select SM_SERIALNUM  from  storage_medium
            where SM_SERIALNUM = v_SIMRANGE and SM_STATUS='r' and SMC_ID in (3)
            minus
            (select SM_SERIALNUM from NMS. SIMDMSLNK where SM_SERIALNUM = v_SIMRANGE
            union
            select SM_SERIALNUM  from NMS.SIMULNK where SM_SERIALNUM = v_SIMRANGE));

             if v_count = 0 then
                raise NO_SIM_WITH_RANGE;
             end if;

            insert into NMS.SIMULNK (SM_SERIALNUM,SM_ID, USER_LASTMOD, LAST_UPDATE, STATUS)
            select SM_SERIALNUM,sm_id,v_user,v_date,'U' from storage_medium where SM_SERIALNUM in
            (select SM_SERIALNUM from storage_medium 
            where SM_SERIALNUM = v_SIMRANGE and SM_STATUS='r' and SMC_ID in (3)
            minus
            (select SM_SERIALNUM from NMS. SIMDMSLNK where SM_SERIALNUM = v_SIMRANGE
            union
            select SM_SERIALNUM  from NMS.SIMULNK where SM_SERIALNUM = v_SIMRANGE));

            COMMIT;
            DBMS_OUTPUT.PUT_LINE ( 'FREE 4G SIM CREATION PROCESS IS COMPLETED SUCCESSFULLY.');
    EXCEPTION
        WHEN  NO_SIM_WITH_RANGE THEN
         DBMS_OUTPUT.PUT_LINE ( 'SIM NOT AVAILABLE WITH RANGE ' ||v_SIMRANGE ||'TO INCLUDE IN FREE SIM POOL.');
        WHEN OTHERS THEN
         DBMS_OUTPUT.put_line ('SQLCODE  : ' || SQLCODE);
        DBMS_OUTPUT.put_line ('ERROR MESSAGE : ' || SQLERRM);
        ROLLBACK;
    END create_FREESIM;

    procedure dummy_dlink is
    v_count integer;
    NO_ACTIVE exception;
    begin

        select count(distinct cd.CD_SM_NUM) into v_count from CONTR_DEVICES cd, contract_all coa , NMS.SIMDMSLNK SIMD
        where coa.CH_STATUS='a' and COA.CO_ID=cd.co_id and SIMD.SM_serialnum=cd.cd_SM_NUM and SIMD.STATUS <> 'D';
        If v_count =0 then
        raise NO_ACTIVE;
        else
        update NMS.SIMDMSLNK set status='D' , Last_update=v_date where status <> 'D' and SM_SERIALNUM in 
        (select distinct  CD_SM_NUM from CONTR_DEVICES cd, contract_all coa 
        where coa.CH_STATUS='a' and COA.CO_ID=cd.co_id);
        COMMIT;
        DBMS_OUTPUT.PUT_LINE ( v_count ||' DUMMY MSISDN D-LINKED');
        end if;
    EXCEPTION
    when NO_ACTIVE then
    NULL;
    WHEN OTHERS THEN
         DBMS_OUTPUT.put_line ('SQLCODE  : ' || SQLCODE);
        DBMS_OUTPUT.put_line ('ERROR MESSAGE : ' || SQLERRM);
    end dummy_dlink;

    procedure update_port_kind
    is
    v_port_id     number;
    v_smc_id      number;
    v_sm_id       number;
    v_vend_code   varchar2 (10);

    BEGIN
   FOR cur
   IN (SELECT   port_id, sm_id
         FROM   port
        WHERE   TRUNC (PORT_STATUSMODDAT) = TRUNC (SYSDATE)
                AND port_kind IS NULL and port_status = 'r')
   LOOP
      SELECT   smc_id
        INTO   v_smc_id
        FROM   storage_medium
       WHERE   sm_id = cur.sm_id;

      SELECT   vendcode
        INTO   v_vend_code
        FROM   storage_medium
       WHERE   sm_id = cur.sm_id;

      IF v_smc_id IN (1, 2) AND v_vend_code = 'DZ'
      THEN
         UPDATE   port
            SET   port_kind = 1
          WHERE   port_id = cur.port_id;
      ELSIF v_smc_id IN (1, 2) AND v_vend_code = 'MORPHO'
      THEN
         UPDATE   port
            SET   port_kind = 2
          WHERE   port_id = cur.port_id;
      ELSIF v_smc_id IN (1, 2) AND v_vend_code = 'GD'
      THEN
         UPDATE   port
            SET   port_kind = 3
          WHERE   port_id = cur.port_id;
      ELSIF v_smc_id = 3 AND v_vend_code = 'DZ'
      THEN
         UPDATE   port
            SET   port_kind = 4
          WHERE   port_id = cur.port_id;
      ELSIF v_smc_id = 3 AND v_vend_code = 'ORN'
      THEN
         UPDATE   port
            SET   port_kind = 5
          WHERE   port_id = cur.port_id;
      ELSIF v_smc_id = 3 AND v_vend_code = 'MORPHO'
      THEN
         UPDATE   port
            SET   port_kind = 6
          WHERE   port_id = cur.port_id;
      END IF;
   END LOOP;

   COMMIT;
END;

END ResourceBindDistribute; 
/

运行上述内容时出现以下错误:

ERROR line 112, col 12, ending_line 112, ending_col 20, Found 'EXCEPTION', Expecting: ( SELECT -or- END -or- $IF : AT BEGIN CASE CLOSE COMMIT CONTINUE CURSOR DAY DECLARE DELETE ELSE ELSIF EXECUTE EXIT FETCH FOR FORALL GOTO identifier IF INSERT LOCK LOOP MERGE MOD MODEL MULTISET NULL OPEN RAISE REM RETURN ROLLBACK SAVEPOINT SET SQL THE UPDATE WHILE WITH YEAR -or- <<”

1 个答案:

答案 0 :(得分:2)

部分
-- Cusrsor opened Dlinked MSISDN, to assign first DLINKED MSISDN

您在开始部分内开始循环,但在异常后结束循环。

如果在匿名块中启动if或循环,则需要确保它完全包含在其中。

相关问题