„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).
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
Yes KKl only Take_further_action kann verwendet werden, um für eine andere Bedingung fortzufahren. Aber logisch ist es auch richtig –