2017-11-26 25 views
0

私は私の手順の一部を持っている。このような何か:IF別のIF内部ELSE文は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; 

ここでの私の目標は次のとおりです。このクエリは「取るさらなる行動」の結果を返すならば、私は他を実装する必要がありますそれ以上の/ if文があればステップ。これが「さらなる行動を取る」場合は、さらに4つの状況(if/else)を追加します。この出力に基づいてif/elseをどのように追加できますか?または、別のプロシージャを作成して、このプロシージャを新しいプロシージャ内でコールする必要がありますか?

答えて

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

IF(v_cnt_1> 0またはv_cnt_2> 0)とTake_further_actionを同じように使用する必要がある理由 THEN DBMS_OUTPUT.PUT_LINE( 'すべて設定'); – kkl

+0

はいKKlのみTake_further_actionを使用して、別の条件に進むことができます。しかし論理的にも正しい –

0

は、「このクエリが結果を返す場合 『さらなる行動を取る』それから私は、他のステップを実装するために持っている場合は、さらに場合/ else文。」私たちは巣ができ

文IF。あなたはさらに文が何であるかを言うことはありませんが、コードは次のようになります。これはあなたがまた、CASE文として、それを構造化する可能性が必要なものである場合

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

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; 

に留意されたいです。 CASEとID/ELSIFの評価が短絡します。これは最初にプログラムが最初の一致条件を実行することを意味するので、一般的な条件の前に特定のケースを持つ必要があります。これはよくない:

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'); 

場合

わからない「私は新しいプロシージャ内でこのプロシージャを別のプロシージャを作成して呼び出す必要がありません」何ではなく実行されるステップであるかのご質問・ドライブ複雑な(2行以上のコード)プログラム全体を読むほうが簡単であるため、手続きを呼び出すのがよりクリーンです(ローカルにすることもできます)。

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; 

、全体のcase文を完全に理解し、どのアクションをトリガする条件を参照することは容易である。この方法は:スケルトンコードでは次のようになりますこと。もちろん、手続きに意味のある名前を付けることは、この理解に役立ちます(30文字のOracle命名制限では必ずしも容易ではありません)。