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;读取当前游标位置的数据的
为什么会这样的呢?谢谢
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;读取当前游标位置的数据的
为什么会这样的呢?谢谢
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;
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每次打开的是一条数据。
OPEN用于打开游标并使游标指向结果集的第一行,
FETCH会检索当前行的信息并把游标指移向下一行,当最后一行也被处理完后,
CLOSE就会关闭游标
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,理因读取到第二行的数据呀,为什么没有数据返回呢
谢谢
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;
/
第一次取后,指针指向数据集结尾,相当于其它语言读文件一样,当前指针指向了EOF
根本就没有第二行,第二次fectch的时候返回的是mycur%notfound
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
应该怎么处理呢?
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;
岂不是userid le.myolve.id%type, username le.myolve.name%type中的userid username就没有用到啦?但是运行以上的代码也是只有一行数据而已呀,不是应该两行数据的吗?即
结果为
1admin而不是:
1 admin
2 le
mycur(1); 你这个是带参数的游标 select id,name from myolve where id=1 就是取出为1的结果集
所以只有 1 admin
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;