2017-05-24 2 views
0

Ich habe den folgenden Codeblock. Kann mir jemand helfen, das zu korrigieren?PL/SQL-Code kommt mit Kompilierungsfehler

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; 
/

auf die oben läuft ich die folgende Fehlermeldung erhalten:

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- <<” 
+0

Beim Ausführen der oben genannten bekomme ich den folgenden Fehler: ERROR Zeile 112, Spalte 12, ending_line 112, ending_col 20, gefunden 'EXCEPTION', erwartet: (SELECT -oder- END -oder- $ IF: AT BEGIN CASE CLOSE COMMIT WEITER CURSOR DAY DECLARE LÖSCHEN ELSE ELSIF EXECUTE EXIT FETCH FÜR FORALL GOTO Bezeichner IF INSERT LOCK LOOP MERGE MOD MODELL MULTISET NULL OFFEN RAISE REM ROLLEN ROLLBACK SAVEPOINT SET SQL DAS UPDATE WÄHREND MIT JAHR -oder- << " – Paul

+0

Können Sie nicht Versuchen Sie, Ihren Code auf den Teil zu reduzieren, der nicht kompiliert? Müssen wir wirklich hyndreds Codezeilen überprüfen? [mcve] kann Ihnen einige Hinweise geben – Aleksej

+0

In der Programmierung haben wir eine Technik namens "Einzug", in dem abhängige Zeilen eingerückt sind ein Standardbetrag unter der Linie, von der sie abhängen, zum Beispiel nach einer "if" Bedingung würden alle Linien funktionieren d wird bis zum entsprechenden 'end if' eingerückt. Dies hat den Effekt, nicht übereinstimmende Anweisungen wie diese hervorzuheben. Versuche es. –

Antwort

2

Im Abschnitt

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

Sie Ihre Schleife beginnen innerhalb des Abschnitt beginnen, aber die Schleife nach Ausnahme beenden .

Wenn Sie ein if oder eine Schleife in einem anonymen Block starten, müssen Sie sicherstellen, dass es vollständig darin enthalten ist.

+0

Hallo, Ich hoffe, das ist, was Sie mich bitten zu tun? öffnen dummydn_cur (v_MSISDN); fetch dummydn_cur Massensammeln in v_dummydn_source; IF v_dummydn_source.count = 0 DANN RAISE NO_DATA_FOUND; ELSE DBMS_OUTPUT.PUT_LINE ('NEUE DUMMY MSISDN SIND MIT SIM VERBUNDEN.'); ENDE IF; \t \t \t \t ENDE IF; \t \t \t \t ENDE SCHLEIFE; – Paul

+0

Das oben genannte wird über den Ausnahmeblock hinzugefügt – Paul