2017-11-26 3 views
0

ich einen Teil meiner Prozedur etwas wie dieses:IF ELSE-Anweisung in einer anderen IF ELSE

 declare 
     v_cnt_1 number; 
     v_cnt_2 number; 
    begin 
     with input1 as(
     select ......... 
     from... 
     where.....) 
     select count(*) into v_cnt_1 
     from input1 t 
     where......); 

     with input2 as(
     select ......... 
     from... 
     where.....) 
     select count(*) into v_cnt_2 
     from input2 t 
     where......); 

     IF v_cnt_1 >0 or v_cnt_2 >0 
     THEN DBMS_OUTPUT.PUT_LINE('all set'); 
     ELSE DBMS_OUTPUT.PUT_LINE('take further action'); 
     end if; 
     end; 

mein Ziel hier ist: Wenn diese Abfrage das Ergebnis ‚weitere Maßnahmen‘ kehrt dann muss ich andere implementieren Schritte, die wenn weitere If/Else-Anweisung. Ich habe vier weitere Situationen (wenn/sonst) hinzuzufügen, wenn dies "weitere Maßnahmen ergreifen" ergibt. Wie kann ich if/else auf der Grundlage dieser Ausgabe hinzufügen? Oder muss ich eine andere Prozedur erstellen und diese Prozedur in einer neuen Prozedur aufrufen?

Antwort

0
declare 
      v_cnt_1 number; 
      v_cnt_2 number; 
      Take_further_action boolean:=False; 
     begin 
      with input1 as(
      select ......... 
      from... 
      where.....) 
      select count(*) into v_cnt_1 
      from input1 t 
      where......); 

      with input2 as(
      select ......... 
      from... 
      where.....) 
      select count(*) into v_cnt_2 
      from input2 t 
      where......); 

      IF v_cnt_1 >0 or v_cnt_2 >0 
      THEN DBMS_OUTPUT.PUT_LINE('all set'); 
      ELSE Take_futher_action :=True; 
       v_cnt_1 :=0; 
       v_cnt_2 :=0; 
    --DBMS_OUTPUT.PUT_LINE('take further action'); 
      end if; 
    --Now put your select into statments here 
    IF (v_cnt_1 >0 or v_cnt_2 >0) and Take_further_action 
      THEN DBMS_OUTPUT.PUT_LINE('all set'); 
Take_further_action :=False; 
      ELSE Take_further_action :=True; 
       v_cnt_1 :=0; 
       v_cnt_2 :=0; 
    --DBMS_OUTPUT.PUT_LINE('take further action'); 
      end if; 

    --Now again put your select into statments here 
    IF (v_cnt_1 >0 or v_cnt_2 >0) and Take_further_action 
      THEN DBMS_OUTPUT.PUT_LINE('all set'); 
Take_further_action :=False; 
      ELSE Take_further_action :=True; 
       v_cnt_1 :=0; 
       v_cnt_2 :=0; 

      end if; 
     --You can perform any number of check with if-then-else as per required 

      end; 
+0

Warum muss ich dieselbe Anweisung zweimal verwenden: IF (v_cnt_1> 0 oder v_cnt_2> 0) und Take_further_action THEN DBMS_OUTPUT.PUT_LINE ('all set'); ?? – kkl

+0

Yes KKl only Take_further_action kann verwendet werden, um für eine andere Bedingung fortzufahren. Aber logisch ist es auch richtig –

0

„wenn diese Abfrage das Ergebnis‚weitere Maßnahmen‘kehrt dann muss ich weitere Schritte umzusetzen, wenn weitere if/else-Anweisung.“

Wir nisten können IF-Anweisungen. Was Sie nicht sagen, was Ihre weiteren Aussagen sind aber Sie Code könnte wie folgt aussehen:

... 
IF v_cnt_1 >0 or v_cnt_2 >0 
    THEN DBMS_OUTPUT.PUT_LINE('all set'); 
ELSE 
    -- take further action 
    if whatever = 0 then 
     DBMS_OUTPUT.PUT_LINE('do something #1'); 
    elsif whatever > 0 and yeahyeah = 0 then 
     DBMS_OUTPUT.PUT_LINE('do something #2'); 
    elsif whatever > 0 and yeahyeah > 0 then 
     DBMS_OUTPUT.PUT_LINE('do something #3'); 
    end if; 
end if; 

Wenn das, was Sie brauchen Sie es auch als CASE-Anweisung Struktur könnte:

case 
    when v_cnt_1 >0 or v_cnt_2 >0 then 
     DBMS_OUTPUT.PUT_LINE('all set'); 
    when whatever = 0 then 
     DBMS_OUTPUT.PUT_LINE('do something #1'); 
    when whatever > 0 and yeahyeah = 0 then 
     DBMS_OUTPUT.PUT_LINE('do something #2'); 
    when whatever > 0 and yeahyeah > 0 then 
     DBMS_OUTPUT.PUT_LINE('do something #3'); 
    else 
     DBMS_OUTPUT.PUT_LINE('Unexpected state'); 
    end case; 

Beachten Sie, dass CASE- und ID/ELSIF-Auswertungen werden kurzgeschlossen. Das bedeutet, dass das erste Programm die erste übereinstimmende Bedingung ausführt, also müssen wir den spezifischen Fall vor dem allgemeinen haben. Das ist nicht gut:

case 
    when whatever = 0 and yeahyeah > 0 then 
     dbms_output.put_line('do something'); 
    when whatever = 0 and yeahyeah = 1 then 
     dbms_output.put_line('will never execute'); 

„brauche ich ein anderes Verfahren erstellen und dieses Verfahren innerhalb neue Prozedur aufrufen“

Nicht sicher, ob, was Ihre Frage Laufwerke aber wenn die ausgeführten Schritte sind kompliziert (sagen wir mehr als ein paar Zeilen Code), es ist sauberer, Prozeduren aufzurufen - sie können lokal sein - weil es einfacher ist, das ganze Programm zu lesen. In Skelett-Code, würde so aussehen:

declare 
    v_cnt_1 number; 
    v_cnt_2 number; 
    ... 
    procedure proc1(p1 number) is 
    ... 
    end p1; 

    procedure proc2(p1 number) is 
    ... 
    end p2; 
begin 
    ... 
    case 
    when v_cnt_1 >0 or v_cnt_2 >0 then 
     null -- 'all set'; 
    when whatever = 0 then 
     proc1(v_cnt_1); 
    when whatever > 0 and yeahyeah = 0 then 
     proc1(v_cnt_2); 
    when whatever > 0 and yeahyeah > 0 then 
     proc1(v_cnt_1); 
     proc2(v_cnt_2); 
    else 
     proc3(42); 
    end case; 

Auf diese Weise ist es einfach, die ganze Fall Aussage und sieht, welche Bedingung Auslöser, die Aktion grok. Natürlich hilft das sinnvolle Benennen der Prozeduren diesem Verständnis (nicht immer einfach mit der Oracle-Namensgrenze von dreißig Zeichen).