SQL游标
游标的属性
隐式游标
declare
v_count number( 3 ) ;
begin
delete from emp where deptno = 10 ;
v_count := SQL % rowcount ;
dbms_output. put_line( '被删除的数据的条数是:' || v_count) ;
end ;
显示游标
declare
cursor cur_emp is select * from emp;
v_emp emp% rowtype;
begin
open cur_emp;
fetch cur_emp into v_emp;
dbms_output. put_line( v_emp. empno|| ',' || v_emp. ename|| ',' ||
v_emp. job|| ',' || v_emp. mgr|| ',' || v_emp. hiredate|| ',' ||
v_emp. sal|| ',' || nvl( v_emp. comm, 0 ) || ',' || v_emp. deptno) ;
close cur_emp;
end ;
declare
cursor cur_emp is select * from emp;
v_emp emp% rowtype;
begin
open cur_emp;
loop
fetch cur_emp into v_emp;
exit when cur_emp% notfound;
dbms_output. put_line( v_emp. empno|| ',' || v_emp. ename|| ',' ||
v_emp. job|| ',' || v_emp. mgr|| ',' || v_emp. hiredate|| ',' ||
v_emp. sal|| ',' || nvl( v_emp. comm, 0 ) || ',' || v_emp. deptno) ;
end loop ;
dbms_output. put_line( '查询游标的总条数' || cur_emp% rowcount ) ;
close cur_emp;
end ;
declare
cursor cur_emp is select * from emp;
v_emp emp% rowtype;
begin
open cur_emp;
fetch cur_emp into v_emp;
while ( cur_emp% found) loop
dbms_output. put_line( v_emp. empno|| ',' || v_emp. ename|| ',' ||
v_emp. job|| ',' || v_emp. mgr|| ',' || v_emp. hiredate|| ',' ||
v_emp. sal|| ',' || nvl( v_emp. comm, 0 ) || ',' || v_emp. deptno) ;
fetch cur_emp into v_emp;
end loop ;
dbms_output. put_line( '查询游标的总条数' || cur_emp% rowcount ) ;
close cur_emp;
end ;
declare
cursor cur_emp is select * from emp;
begin
for v_emp in cur_emp loop
dbms_output. put_line( v_emp. empno|| ',' || v_emp. ename|| ',' ||
v_emp. job|| ',' || v_emp. mgr|| ',' || v_emp. hiredate|| ',' ||
v_emp. sal|| ',' || nvl( v_emp. comm, 0 ) || ',' || v_emp. deptno) ;
end loop ;
end ;
declare
cursor cur_emp( v_deptno number) is select * from emp where deptno= v_deptno;
v_emp emp% rowtype;
begin
open cur_emp( 20 ) ;
loop
fetch cur_emp into v_emp;
dbms_output. put_line( v_emp. empno|| ',' || v_emp. ename|| ',' ||
v_emp. job|| ',' || v_emp. mgr|| ',' || v_emp. hiredate|| ',' ||
v_emp. sal|| ',' || nvl( v_emp. comm, 0 ) || ',' || v_emp. deptno) ;
exit when cur_emp% notfound;
end loop ;
end ;
使用游标更新或删除行数据
允许使用游标删除或更新活动集中的行
声明游标时必须使用 select . . . . for update 语句
declare
v_emp emp% rowtype;
cursor mycur is select * from emp where deptno= 20 for update ;
begin
open mycur;
fetch mycur into v_emp;
while mycur% found loop
update emp set sal = 100 where current of mycur;
fetch mycur into v_emp;
end loop ;
close mycur;
end ;
REF游标
declare
type myret is ref cursor ;
cur_emp myret;
v_emp emp% rowtype;
begin
open cur_emp for select * from emp;
fetch cur_emp into v_emp;
while cur_emp% found loop
dbms_output. put_line( v_emp. empno|| ',' || v_emp. ename|| ',' ||
v_emp. job|| ',' || v_emp. mgr|| ',' || v_emp. hiredate|| ',' ||
v_emp. sal|| ',' || nvl( v_emp. comm, 0 ) || ',' || v_emp. deptno) ;
fetch cur_emp into v_emp;
end loop ;
close cur_emp;
end ;