IF ELSE语句在另一个IF ELSE中

时间:2017-11-26 05:31:45

标签: sql oracle if-statement stored-procedures plsql

我的部分程序是这样的:

     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 / else语句。如果返回'采取进一步行动',我还有四个情况(if / else)要添加。如何在此输出的基础上添加if / else?或者我是否需要创建另一个过程并在新过程中调用此过程?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

  

"如果此查询返回结果,请采取进一步措施'那么我必须实现其他步骤,如果进一步if / else语句。 "

我们可以嵌套IF语句。您不能说出您的进一步陈述,但您的代码可能如下所示:

...
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声明:

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

"我是否需要创建另一个过程并在新过程"

中调用此过程

不确定你的问题是什么驱动,但如果执行的步骤很复杂(比如几行代码),调用程序会更清晰 - 它们可以是本地的 - 因为它是只是更容易阅读整个程序。在骨架代码中看起来像:

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命名限制并不总是很容易)。