Oracle基础学习(四) 游标
CURSOR 游标名 IS 操作语句; --1、定义游标
OPEN 游标名; --2、打开游标
LOOP
FETCH 游标名 INTO 变量名; --3.读取游标
EXIT WHEN 游标名%NOTFOUND;
处理语句;
END LOOP;
CLOSE 游标名;--4.关闭游标
隐式游标的属性 返回值类型 意 义 SQL%ROWCOUNT 整型 代表DML语句成功执行的数据行数 SQL%FOUND 布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功 SQL%NOTFOUND 布尔型 与SQL%FOUND属性返回值相反 SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假
1、声明游标:
cursor curname is select.......
2、打开游标:
open curname;
3、提取数据:循环提取数据:游标中的谓词 curname%found 、curname%notfound。
当结果集中的数据没有提取完时 %found的值true,否则是false.
%notfound与%found 相反。通过两个谓词可以控制循环
fetch curname into .......
4、关闭游标
close curname;
②遍历循环游标
⑴For 循环游标
循环游标隐式打开游标,自动滚动获取一条记录,并自动创建临时记录类型变量存储记录。处理完后自动关闭游标。
For 变量名 In 游标名
Loop
数据处理语句;
End Loop;
⑵Loop循环游标
。。。
Loop
Fatch 游标名InTo 临时记录或属性类型变量;
Exit When 游标名%NotFound;
End Loop;
例子1:
/* conn scott/tiger */
Declare
Cursor myCur is select empno,ename,sal from emp;
vna varchar2(10);
vno number(4);
vsal number(7,2);
Begin
open myCur;
fetch myCur into vno,vna,vsal;
dbms_output.put_line(vno||' '||vna||' '||vsal);
close myCur;
End;
/
例子2:使用loop遍历游标。
Declare
Cursor myCur is select ename,job,sal,empno from emp;
varE myCur%rowType;
Begin
if myCur%isopen = false then
open myCur;
dbms_output.put_line('Opening...');
end if;
loop
fetch myCur into varE;
exit when myCur%notfound;
dbms_output.put_line(myCur%rowCount||' '||vare.empno||' '||vare.ename||' '||vare.sal);
end loop;
if myCur%isopen then
Close myCur;
dbms_output.put_line('Closing...');
end if;
End;
/
例子3:使用For循环遍历游标,
/* conn scott/tiger */
Declare
Cursor myCur is select * from emp;
Begin
for varA in myCur
loop
dbms_output.put_line(myCur%rowCount||' '||varA.empno||' '||varA.ename||' '||varA.sal);
end loop;
End;
/
declare --类型定义 cursor c_job is select empno,ename,job,sal from emp where job='MANAGER'; --定义一个游标变量 c_row c_job%rowtype; begin open c_job; loop --提取一行数据到c_row fetch c_job into c_row; --判读是否提取到值,没取到值就退出 --取到值c_job%notfound 是false --取不到值c_job%notfound 是true exit when c_job%notfound; dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal); end loop; --关闭游标 close c_job; end;
--5:向游标传递一个工种,显示此工种的所有雇员的所有信息(使用参数游标) declare cursor c_job(p_job nvarchar2) is select * from emp where JOB=p_job; r_job emp%rowtype; begin for r_job in c_job('CLERK') loop dbms_output.put_line('员工号'||r_job.EMPNO||' '||'员工姓名'||r_job.ENAME); end loop; end; SELECT * FROM EMP