create or replace procedure my_proc(i int) is
begin
  while i<20 loop
    insert into test values(i,'avb');
    i := i+1;
  end loop;
end;

解决方案 »

  1.   

    PROCEDURE my_proc 已编译
    Warning: 执行完毕, 但带有警告
      

  2.   

    PROCEDURE my_proc1 已编译
    Warning: 执行完毕, 但带有警告在行 25 上开始执行命令时出错:
    exec my_proc1(12)
    错误报告:
    ORA-06550: 第 1 行, 第 7 列: 
    PLS-00905: 对象 SYSTEM.MY_PROC1 无效
    ORA-06550: 第 1 行, 第 7 列: 
    PL/SQL: Statement ignored
    06550. 00000 -  "line %s, column %s:\n%s"
    *Cause:    Usually a PL/SQL compilation error.
    *Action:
      

  3.   

    Errors for PROCEDURE MY_PROC:LINE/COL ERROR
    -------- -----------------------------------------------------------------
    5/3  PL/SQL: Statement ignored
    5/3  PLS-00363: expression 'I' cannot be used as an assignment target-- 传入的参数 i 在 while 循环中不应该被引用,这个时候应该用for 循环
    -- 修改为:create or replace procedure my_proc(i int) is
    begin
      for t in 1..i loop
      insert into test values(t,'avb');
      end loop;
      commit; -- 别忘记提交
    end;
    /
    lym@TDWORA> exec my_proc(30);PL/SQL procedure successfully completed.lym@TDWORA> select * from test; ID CNAME
    ---------- --------------------
     1 avb
     2 avb
     3 avb
     4 avb
     5 avb
     6 avb
     7 avb
     8 avb
     9 avb
    10 avb
    11 avb
    12 avb
    13 avb
    14 avb
    15 avb
    16 avb
    17 avb
    18 avb
    19 avb
    20 avb
    21 avb
    22 avb
    23 avb
    24 avb
    25 avb
    26 avb
    27 avb
    28 avb
    29 avb
    30 avb30 rows selected.
      

  4.   

    也就是说 while 循环中的判断值 不应该是你的存储过程传入的参数;
    -- 因为你要在 while 中不断递减这个参数,而传入的参数是不能修改的;
    -- 你还可以这样:在存储过程中定义一个局部变量,先接收传入的参数,然后用局部变量递减:
    -- 详细代码如下:
    create or replace procedure my_proc(i int) is
      v_i int;
    begin
      v_i := i; -- 接收传入的参数值
      while v_i > 0 loop
       insert into test values(v_i,'avb');
       v_i := v_i - 1;
      end loop;
      commit; -- 别忘记提交
    end;
    /
    -- 还有: 
    create or replace procedure my_proc(i int) is
    begin
      while i<20 loop
      insert into test values(i,'avb');
      i := i+1;
      end loop;
    end;-- 如果你传入的参数少于20,程序会进入死循环!
      

  5.   


    这应该是
     insert into test values(i,'avb');语句的问题检查test表的字段数量,例如test有3个字段 a,b,c
    insert into test (a,b) values(i,'avb')这样写