declare
id number;
var varchar2(50);
cursor mycur(type number) is   (声明游标)
select id,name from myolve where id=type;begin
open mycur(1);
fetch mycur into id,var;
while mycur%found
loop
dbms_output.put_line(id||var);
fetch mycur into id,var;
end loop;
close mycur;
end;创建了表myolve如下
id  name
1   admin
2   le

运行的结果为:
1admin但是按道理应该是
1admin
2le
因为在循环体里边有fetch mycur into id,var;读取当前游标位置的数据的
为什么会这样的呢?谢谢

解决方案 »

  1.   

    你给游标传了一个参数1,当然只会匹配id是1的记录,不会匹配id是2的记录
      

  2.   

    declare
    id_index number := 1;
    id number;
    var varchar2(50);
    cursor mycur(type number) is
    select id,name from mylove where id=type;begin
    open mycur(id_index);
    fetch mycur into id,var;
    while mycur%found
    loop
    dbms_output.put_line(id||' '||var);
    id_index := id_index + 1;
    close mycur;
    open mycur(id_index);
    fetch mycur into id,var;
    end loop;
    close mycur;
    end;
      

  3.   

    1,根据你传入的参数1,只能返回数据1 admin
    2,begin
    open mycur(1);  --打开游标
    fetch mycur into id,var;  --打开游标的第一条数据
    while mycur%found --此时返回TRUE,进入循环
    loop
    dbms_output.put_line(id||var); 
    fetch mycur into id,var; --打开第二条数据,此时没有数据返回
    end loop; --继续循环,%found 返回为FALSE,退出循环
    close mycur;
    end;个人建议你的写法修改为:
    open mycur(1); 
    loop 
    fetch mycur into id,var;  
    EXIT WHEN mycur%notfound 
    dbms_output.put_line(id||var); 
    end loop; 
    close mycur;
    因为fetch每次打开的是一条数据。
      

  4.   

    附:
    OPEN用于打开游标并使游标指向结果集的第一行,
    FETCH会检索当前行的信息并把游标指移向下一行,当最后一行也被处理完后,
    CLOSE就会关闭游标
      

  5.   

    谢谢 thefirstz heyang714
    to heyang714:
    set serveroutput on;
    declare
    id number;
    var varchar2(50);
    cursor mycur(type number) is
    select id,name from myolve where id=type;
    begin
    open mycur(1);
    loop
    fetch mycur into id,var;
    exit when mycur%notfound
    dbms_output.put_line(id||var);
    end loop;
    close mycur;

    end;
    运行以上代码出现错误,为什么呢OPEN用于打开游标并使游标指向结果集的第一行,
    FETCH会检索当前行的信息并把游标指移向下一行,fetch mycur into id,var; --打开第二条数据,此时没有数据返回==================================
    正如thefirstz所说的给游标传了一个参数1,当然只会匹配id是1的记录,不会匹配id是2的记录。
    但是我想,当用open打开游标并使游标指向结果集的第一行,fetch mycur into id,var读取第一行的数据。
    这时候,游标后移一行,也就是第二行,用fetch mycur into id,var,理因读取到第二行的数据呀,为什么没有数据返回呢
    谢谢
      

  6.   

    对于静态游标,推荐写法是使用游标for循环,更简洁。
    DECLARE
      CURSOR mycur(i_TYPE NUMBER) IS
        SELECT id, NAME FROM myolve WHERE id = i_TYPE;
    BEGIN
      FOR c IN mycur(1) LOOP
        dbms_output.put_line(c.id || c.NAME);
      END LOOP;
    END;
    /
      

  7.   


    第一次取后,指针指向数据集结尾,相当于其它语言读文件一样,当前指针指向了EOF
    根本就没有第二行,第二次fectch的时候返回的是mycur%notfound
      

  8.   

    谢谢tangren
    to tangren:set serveroutput on;
    declare
    type user_record_type is record
    (userid  le.myolve.id%type,
    username le.myolve.name%type);
    var_userrecord user_record_type;cursor mycur(vartype number) is
    select id,name from myolve where id=vartype;begin
    for var_userrecord in mycur(1) loop
    dbms_output.put_line(var_userrecord.userid||var_userrecord.username);
    end loop;
    end;
    运行以上代码,为什么会出现以下的错误提示呢:
    第10行出现错误:
    ora-06550:第10行,第37列
    pls-00302:必须说明‘userid’组件
    ora-06550:第10行,第1列:
    pl/sql:statement ignored
    应该怎么处理呢?
      

  9.   

    set serveroutput on;
    declare
    type user_record_type is record
    (userid le.myolve.id%type,
    username le.myolve.name%type);
    var_userrecord user_record_type;cursor mycur(vartype number) is
    select id,name from myolve where id=vartype;begin
    for var_userrecord in mycur(1) loop
    dbms_output.put_line(var_userrecord.id||var_userrecord.name);
    end loop;
    end;
      

  10.   

    to monitor为什么会是真样的呢?dbms_output.put_line(var_userrecord.id||var_userrecord.name);
    岂不是userid le.myolve.id%type,  username le.myolve.name%type中的userid  username就没有用到啦?但是运行以上的代码也是只有一行数据而已呀,不是应该两行数据的吗?即
    结果为
    1admin而不是:
    1 admin
    2 le
      

  11.   


    mycur(1); 你这个是带参数的游标 select id,name from myolve where id=1 就是取出为1的结果集
    所以只有 1 admin
      

  12.   


    declare
    type user_record_type is record
    (userid le.myolve.id%type,username le.myolve.name%type);
    var_userrecord user_record_type;
    cursor mycur(vartype number) is select id,name from myolve where id=vartype;
    begin
    for var_userrecord in mycur(1) loop
    dbms_output.put_line(var_userrecord.id||var_userrecord.name);
    end loop;
    end;--or
    declare
    type user_record_type is record
    (userid le.myolve.id%type,username le.myolve.name%type);
    var_userrecord user_record_type;
    cursor mycur is select id,name from myolve;
    begin
    for i in mycur loop
    var_userrecord.userid:=i.id;
    var_userrecord.name:=i.name
    dbms_output.put_line(var_userrecord.id||var_userrecord.name);
    end loop;
    end;
      

  13.   

    select id,name from myolve where id=vartype;楼主的这个查询语句返回的应该是2条id=1的数据,希望给游标一个参数后循环执行2次,可是游标一次只能取一条数据,如果给条件(参数)的话。只取符合的第一条数据,我是这样理解的,不知道对不?