set serveroutput on;--定义游标declarecursor cu_emp isselect empno,ename,sal from emp;--定义变量,接收数据--动态指定内存 %type-- e_no emp.empno%type;
e_no number;
e_name varchar2(10);
e_sal number;begin--打开游标open cu_emp;--取值(一条语句)fetch cu_emp into e_no,e_name,e_sal;-- %found loop:如果之前的select语句查询到结果了,就开始循环进行处理。while cu_emp%found loop
dbms_output.put_line('编号:'||e_no||',姓名:'||e_name||',薪资:'||e_sal);fetch cu_emp into e_no,e_name,e_sal;endloop;--关闭游标close cu_emp;end;
扩展:定义行类型
set serveroutput on;--定义游标declarecursor cu_emp isselect*from emp where sal>2000and sal<3000;--定义变量,接收数据--定义动态行类型
e emp%rowtype;begin--打开游标open cu_emp;--取值(一条语句)fetch cu_emp into e;-- %found loop:如果之前的select语句查询到结果了,就开始循环进行处理。while cu_emp%found loop
dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',薪资:'||e.sal);fetch cu_emp into e;endloop;--关闭游标close cu_emp;end;
隐式游标
隐式游标的属性
返回值类型
意义
SQL%ROWCOUNT
整型
代表DML语句成功执行的数据行数
SQL%FOUND
布尔型
值为TRUE代表插入、删除、更新或单行查询操作成功
SQL%NOTFOUND
布尔型
值为TRUE代表插入、删除、更新或单行查询操作未成功
SQL%ISOPEN
布尔型
DML执行过程中为真,结束后为假
beginifsql%isopen then
dbms_output.put_line('游标打开');else
dbms_output.put_line('游标未打开');endif;end;
beginupdate emp set ename='马云'where empno=123;ifsql%rowcount=1then
dbms_output.put_line('已更新');else
dbms_output.put_line('未更新');endif;end;
动态游标
强类型动态游标
--定义动态游标,返回类型为Emp表中的动态行类型 declaretype emptype is ref cursorreturn emp%rowtype;
cu_emp emptype;
e_count number;
e emp%rowtype;--定义行记录beginselectcount(*)into e_count from emp where job='PRESIDENT';if e_count=0thenopen cu_emp forselect*from emp;elseopen cu_emp forselect*from emp where job='PRESIDENT';endif;fetch cu_emp into e ;while cu_emp%found loop
dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',薪资:'||e.sal);fetch cu_emp into e;endloop;--关闭游标close cu_emp;end;
弱类型动态游标
declaretype customType is ref cursor;
e_count number;
e emp%rowtype;--定义行记录
s salgrade%rowtype;
cType customType;beginselectcount(*)into e_count from emp where job='PRESIDENT';if e_count=0thenopen cType forselect*from salgrade;fetch cType into s ;while cType%found loop
dbms_output.put_line('等级:'||s.grade||',最低薪资:'||s.losal||',最高薪资:'||s.hisal);fetch cType into e;endloop;--关闭游标close cType;elseopen cType forselect*from emp where job='PRESIDENT';fetch cType into e ;while cType%found loop
dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',薪资:'||e.sal);fetch cType into e;endloop;--关闭游标close cType;endif;end;