请教PL/SQL 循环问题 希望各位大大多多指教... Q:我现在要处理一个循环问题,
在一个循环里面执行相关处理,如下:
Loop
执行1,
执行2,
执行3...
end loop;
要求:当在执行到3出现错误时,进行报错,且循环回到从执行1开始。
这个用什么方法?如何实现呢?请各位大神多多指教。3Q3Q了...
PL/SQLoracle 

解决方案 »

  1.   


    ChenZw> ed
    已写入 file afiedt.buf  1  BEGIN
      2      FOR I IN 1..3 LOOP
      3          BEGIN
      4                DBMS_OUTPUT.PUT_LINE(I||'_01');
      5                IF I=2 THEN
      6                    RAISE_APPLICATION_ERROR(-9999,'USER EXCEPTION');
      7                END IF;
      8                DBMS_OUTPUT.PUT_LINE(I||'_01');
      9                DBMS_OUTPUT.PUT_LINE(I||'_01');
     10            EXCEPTION
     11                WHEN OTHERS THEN
     12                CONTINUE;
     13            END;
     14      END LOOP;
     15* END;
    ChenZw>
    ChenZw> /
    1_01
    1_01
    1_01
    2_01
    3_01
    3_01
    3_01PL/SQL 过程已成功完成。ChenZw>
      

  2.   

    还有一种方式,是可以实现,就是使用GOTO 标签的方式。在PL/SQL中,使用continue和GOTO。能够解决你的这个问题。
      

  3.   

    3Ql..
    不过Goto标签的方法在pl/SQL中一般不是不给用的吗?
    还有Continue 在包里面好像用不了。
      

  4.   

    Loop
     <<MY_CONTINUE>>
     执行1,
     执行2,
     执行3
     (执行3可以写到一个单独的function或者procedure里,如果执行过程中出现异常,记录异常(日志表)同时返回标志位,如flag=‘errror’)
     if flag = 'error' then
        GOTO    MY_CONTINUE;  
     end if;  end loop;
      

  5.   

    一,continue在oracle11g以前无法使用continue实现退出当前循环(11g中据说实现了),但是可以用以下方法模拟实现:declare 
    --定义变量
    begin
         for i in 1..10 loop --真正的循环
             for j in 1..1 loop --假循环,目的是模拟出continue效果
                 if i = 6 then
                    exit;--这个exit相当于continue
                 end if ;
                 dbms_output.put_line(i);
             end loop ;
         end loop;dbms_output.put_line('over');
    end ;在oracle11g中可以用以下方式实现:declare 
    --定义变量
    begin
         for i in 1..10 loop --真正的循环
           if i = 6 then
             continue;--用if语句和continue实现
           end if ;
           dbms_output.put_line(i);
         end loop;     dbms_output.put_line('over');
    end ;declare
    --定义变量
    begin
         for i in 1..10 loop --真正的循环
           continue when i = 6;--用continue when实现
           dbms_output.put_line(i);
         end loop;     dbms_output.put_line('over');
    end ;二,breakoracle中并没有break关键字,但是可以用exit关键字来代替break实现退出循环declare
    --定义变量
    begin
         for i in 1..10 loop
             if i < 6 then
                exit ;--退出循环,相当于break
             end if ;
             dbms_output.put_line(i);
         end loop ;     dbms_output.put_line('over');
    end ;