PL / SQL打印游标元素

时间:2014-02-24 09:42:56

标签: oracle plsql while-loop cursor

我尝试了几种方法并查看了很多代码,但我无法做到。我有2张桌子

Declare
   v_ay  varchar2(32);
   cursor c_clone_time is 
     select beko_user_ref 
      from user_role;
begin
   open c_clone_time;
   fetch c_clone_time into v_ay
   WHILE c_clone_time%FOUND LOOP
     dbms_output.put_line (v_ay);
   end while;
end;

我只是想打印光标值,但总是失败。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

您的代码中需要注意几个点(语法,语义和逻辑错误):

  1. 次要的。 fetch c_clone_time into v_ay语句未以分号;终止。
  2. 您可以将while作为包含end loop;子句的任何其他循环语句结束,而不是end whileend for
  3. 为了能够打印光标内容并成功退出循环,你需要从循环中的光标中取出,否则你会陷入一个永无止境的循环:
  4. 说过你的代码可能看起来像这样:

    declare
      v_ay  varchar2(32);
      cursor c_clone_time is 
        select beko_user_ref 
          from user_role;
    begin
      open c_clone_time;
      fetch c_clone_time into v_ay;
      while c_clone_time%found loop
        dbms_output.put_line (v_ay);
        fetch c_clone_time into v_ay;
      end loop;
    end;
    

    测试用例:

    create table user_role(
      beko_user_ref varchar2(100)
    );
    
    insert into user_role(beko_user_ref)
      select dbms_random.string('l', 7)
        from dual
     connect by level <= 7;
    
    commit;
    

    打印光标:

    set serveroutput on;
    clear screen;
    
    declare
      v_ay  varchar2(32);
      cursor c_clone_time is 
        select beko_user_ref 
          from user_role;
    begin
      open c_clone_time;
      fetch c_clone_time into v_ay;
      while c_clone_time%found loop
        dbms_output.put_line (v_ay);
        fetch c_clone_time into v_ay;
      end loop;
    end;
    

    结果:

    anonymous block completed
    kcjhygy
    cgunlmt
    ofxaspd
    qwqvnxx
    nxjdrli
    luevaqk
    xvdocpr