declare
i int:=1;
begin
  loop
    dbms_output.put_line('输出i='||i);
    if i=10 then
      goto end_loop;
    end if;
    i:=i+1;  
  end loop;
  dbms_output.put_line('循环结束');
  <<end_loop>>
  --dbms_output.put_line('over');
end;请问去掉注释部分为什么报错?

解决方案 »

  1.   

    SQL> edi
    已写入 file afiedt.buf  1  declare
      2  i int:=1;
      3  begin
      4    loop
      5      dbms_output.put_line('输出i='||i);
      6      if i=10 then
      7        goto end_loop;
      8      end if;
      9      i:=i+1;
     10    end loop;
     11    dbms_output.put_line('循环结束');
     12    <<end_loop>>
     13  dbms_output.put_line('over');
     14* end;
    SQL> /
    输出i=1
    输出i=2
    输出i=3
    输出i=4
    输出i=5
    输出i=6
    输出i=7
    输出i=8
    输出i=9
    输出i=10
    overPL/SQL 过程已成功完成。
      

  2.   

    The label end_loop in the Example 4-20 is not allowed unless it is preceded by an executable statement. To make the label legal, a NULL statement is added.Example 4-20 Using a NULL Statement to Allow a GOTO to a LabelDECLARE
       done  BOOLEAN;
    BEGIN
       FOR i IN 1..50 LOOP
          IF done THEN
             GOTO end_loop;
          END IF;
       <<end_loop>>  -- not allowed unless an executable statement follows
       NULL; -- add NULL statement to avoid error
       END LOOP;  -- raises an error without the previous NULL
    END;
    /
      

  3.   

     declare
     i int:=1;
     begin
       loop
         dbms_output.put_line('输出i='||i);
         if i=10 then
           goto end_loop;
         end if;
         i:=i+1;
       end loop;
       dbms_output.put_line('循环结束');
       <<end_loop>>
       --dbms_output.put_line('over');
       null; 
    --你的<<end_loop>>标签里没有任何语句是会报错的,如果你不想做任何操作可以用null语句
    --不过你的这样可以用while循环,最后不要使用goto语句
     end;
      

  4.   

    label只能放在某个可执行的语句前面,表示将跳转到该执行语句.不能直接跳转到末尾.
      

  5.   


    没看清你的意思 对于
    goto label;
    ....
    <<label>>  后面的接上执行语句 或者 null;
    null;
    declare
    i int:=1;
    begin
      loop
        dbms_output.put_line('输出i='||i);
        if i=10 then
          goto end_loop;
        end if;
        i:=i+1;  
      end loop;
      dbms_output.put_line('循环结束');
      <<end_loop>>
      null;
      --dbms_output.put_line('over');
    end;