游标(光标Cursor)
在java程序中有集合的概念,那么在pl/sql中也会用到多条记录,这时就要用到游标,游标可以存储查询返回的多条数据。
语法:
cursor 游标名 [(参数名 数据类型, 参数名 数据类型,····)] is select语句;
例如: cursor emps is select * from emp;
范例一:(无参数)
用游标方式输出emp1表的name、job、hdate、sal
declare
cursor emps is select * from emp1;
rs emp%rowtype;
begin
--1.开启游标
open emps;
--2.从游标中提取数据
loop
fetch emps into rs;
exit when emps%notfound;
dbms_output.put_line('name--'||rs.name||' job--'||rs.job||' birthday--'||to_char(rs.hdate,'fmyyyy-mm-dd')||' salary--'||rs.sal);
end loop;
--3.关闭游标
close emps;
end;
范例二:(有参数)
用游标方式输出指定部门下所有员工的dept_id、name、job、hdate、sal
declare
cursor emps(emp_id emp1.id%type) is
select * from emp1 where dept_id=emp_id;
rs emp%rowtype;
begin
open emps(10);
loop
fetch emps into rs;
exit when emps%notfound;
dbms_output.put_line('dept_id--'||rs.dept_id||' name--'||rs.name||' job--'||rs.job||' birthday--'||to_char(rs.hdate,'fmyyyy-mm-dd')||' salary--'||rs.sal);
end loop;
close emps;
end;
范例三:(有参数)
为部门号为10的所有员工涨1000的工资
declare
cursor pc(dno emp1.dept_id%type) is
select id from emp1 where dept_id=dno;
pno emp1.id%type;
begin
open pc(10);
loop
fetch pc into pno;
exit when pc%notfound;
update emp1 t set t.sal=t.sal+1000 where t.id=pno;
end loop;
close pc;
end;
系统引用游标
declare
emps sys_refcursor;
rs emp1%rowtype;
begin
open emps for select * from emp1;
loop
fetch emps into rs;
exit when emps%notfound;
dbms_output.put_line(rs.name||' earns '||rs.sal||'$ every month');
end loop;
close emps;
end;
使用for循环打开游标
使用for循环来遍历游标,会自动申明一个记录型的变量、自动打开游标、自动赋值、自动关闭游标。
declare
cursor emps is select * from emp1;
begin
for rs in emps loop
dbms_output.put_line(rs.name||'---'||rs.sal);
end loop;
end;