/**
plsql游标
*/
/**
显示游标
*/
declare
cursor emp_cursor is select ename,sal from emp;
v_name varchar2(40);
v_sal number;
begin
open emp_cursor;
loop
fetch emp_cursor into v_name,v_sal;
exit when emp_cursor%notfound;
dbms_output.put_line(v_name || ':' ||v_sal);
end loop;
close emp_cursor;
end;
/**
显示游标的属性
*/
declare
cursor emp_cursor is select ename,sal from emp;
v_name varchar2(40);
v_sal number;
begin
if emp_cursor%isopen then
dbms_output.put_line('游标已经打开');
else
dbms_output.put_line('现在打开游标');
open emp_cursor;
end if;
loop
fetch emp_cursor into v_name,v_sal;
if emp_cursor%notfound then
dbms_output.put_line('没有找到数据退出');
exit;
end if;
dbms_output.put_line(emp_cursor%rowcount || ':' || v_name || ':' ||v_sal);
end loop;
close emp_cursor;
end;
/**
使用bulk collect批量提取数据
*/
declare
type emp_record_type is record(
ename emp.ename%type,
sal emp.sal%type
);
type emp_table_type is table of emp_record_type;
emp_table emp_table_type;
cursor emp_cursor is select ename,sal from emp;
begin
open emp_cursor;
fetch emp_cursor bulk collect into emp_table;
for i in 1.. emp_table.count loop
dbms_output.put_line(emp_table(i).ename ||':'||emp_table(i).sal);
end loop;
close emp_cursor;
end;
/**
基于游标定义记录变量
*/
declare
cursor emp_cursor is select ename,sal from emp;
emp_record emp_cursor%rowtype;
begin
open emp_cursor;
loop
fetch emp_cursor into emp_record;
exit when emp_cursor%notfound;
dbms_output.put_line(emp_record.ename ||':'||emp_record.sal);
end loop;
close emp_cursor;
end;
/**
参数游标
*/
declare
cursor emp_cursor(no varchar2) is select ename,sal from emp where empno=no;
emp_record emp_cursor%rowtype;
begin
open emp_cursor('7788');
loop
fetch emp_cursor into emp_record;
exit when emp_cursor%notfound;
dbms_output.put_line(emp_record.ename ||':'||emp_record.sal);
end loop;
close emp_cursor;
end;
/**
使用游标更新和删除数据
*/
declare
cursor teacher_cursor is select name from teacher for update;
v_name teacher.name%type;
begin
open teacher_cursor;
loop
fetch teacher_cursor into v_name;
exit when teacher_cursor%notfound;
update teacher set name='newname' where current of teacher_cursor;
end loop;
close teacher_cursor;
end;
/**
游标for循环
*/
declare
cursor emp_cursor is select ename,sal from emp;
begin
for emp_record in emp_cursor loop
dbms_output.put_line(emp_record.ename ||':'||emp_record.sal);
end loop;
end;
/**
for循环中直接使用子查询
*/
begin
for emp_record in (select ename,sal from emp) loop
dbms_output.put_line(emp_record.ename ||':'||emp_record.sal);
end loop;
end;
/**
游标变量
*/
declare
type emp_cursor_type is ref cursor;
emp_cursor emp_cursor_type;
v_name varchar2(40);
v_sal number;
begin
open emp_cursor for select ename,sal from emp;
/*使用for循环报错
for emp_record in emp_cursor loop
dbms_output.put_line(emp_record.ename ||':'||emp_record.sal);
end loop;
*/
loop
fetch emp_cursor into v_name,v_sal;
exit when emp_cursor%notfound;
dbms_output.put_line(v_name ||':'|| v_sal);
end loop;
close emp_cursor;
end;
/**
带返回值的游标变量
*/
declare
type emp_record_type is record(
ename varchar2(40),
sal number
);
type emp_cursor_type is ref cursor return emp_record_type;
emp_cursor emp_cursor_type;
emp_record emp_record_type;
begin
open emp_cursor for select ename,sal from emp;--select语句返回值必须和emp_record_type一样
loop
fetch emp_cursor into emp_record;
exit when emp_cursor%notfound;
dbms_output.put_line(emp_record.ename ||':'|| emp_record.sal);
end loop;
close emp_cursor;
end;