-- Created on 2018/11/6 by YXQ
--显示游标 & 静态游标的处理
declare
--定义(游标一个可以遍历的结果集)
--声明cursor,创建和命名一个sql工作区
--显式游标对应一个返回结果为多行多列的SELECT语句。
--游标一旦打开,数据就从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。
CURSOR v_row_cur is
select * from scott.emp where empno < 7900;
v_row v_row_cur%rowtype; --用rowtype接收遍历游标结果集记录
CURSOR v_id_cur IS
select empno from scott.emp where empno < 7900;
v_id_type scott.emp.empno%type; --用id%type接收遍历游标结果集记录
v_num_id NUMBER(11); --用NUMBER(11)接收遍历游标结果集记录
cursor v_namecn_cur is
select ename from scott.emp where empno < 7900;
v_var2_type_namecn10 varchar2(10); --用varchar2(10)接收遍历游标结果集记录
v_var2_type_namecn1024 varchar2(1024); --?? varchar2(10)也全部输出没有截取,varchar2(1024)也输出
begin
--用id%type接收select结果记录,隐式游标 v_id_type
select empno into v_id_type from scott.emp where empno = 7788;
DBMS_OUTPUT.PUT_LINE(v_id_type);
--用NUMBER(11)接收select结果记录,隐式游标 v_num_id
select empno into v_num_id from scott.emp where empno = 7788;
DBMS_OUTPUT.PUT_LINE(v_num_id);
--不可以用未定义的标识符接收select结果记录,因为DML操作和单行SELECT语句(单行查询操作:SELECT ... INTO ...)会使用隐式游标
--select empno into rec from scott.emp where empno = 4593; --PLS-00201: identifier 'REC' must be declared
--DBMS_OUTPUT.PUT_LINE(rec);
--执行(常用For语句遍历游标)
--用rowtype接收遍历游标结果集记录
FOR v_row IN v_row_cur LOOP
DBMS_OUTPUT.PUT_LINE(v_row.empno);
END LOOP;
--用id%type接收遍历游标结果集记录
FOR v_id_type IN v_id_cur LOOP
DBMS_OUTPUT.PUT_LINE(v_id_type.empno);
END LOOP;
--用隐含定义的记录变量 record_index 收遍历游标结果集记录
FOR record_index IN v_id_cur LOOP
DBMS_OUTPUT.PUT_LINE(record_index.empno);
END LOOP;
--用NUMBER(11)接收遍历游标结果集记录
FOR v_num_id IN v_id_cur LOOP
DBMS_OUTPUT.PUT_LINE(v_num_id.empno);
END LOOP;
--用varchar2(10)接收遍历游标结果集记录
for v_var2_type_namecn10 in v_namecn_cur loop
dbms_output.put_line(v_var2_type_namecn10.ename);
end loop;
--用varchar2(1024)接收遍历游标结果集记录
for v_var2_type_namecn1024 in v_namecn_cur loop
dbms_output.put_line(v_var2_type_namecn1024.ename);
end loop;
--用隐含定义的记录变量 preod_rec 接收遍历游标结果集记录
FOR preod_rec IN v_namecn_cur LOOP
DBMS_OUTPUT.PUT_LINE(preod_rec.ename);
END LOOP;
--另一种形式的游标循环,该种形式更为简单,省略了游标的定义,游标的SELECT查询语句在循环中直接出现。
FOR preod_rec IN (select * from scott.emp where empno < 7900)
LOOP
DBMS_OUTPUT.PUT_LINE('XH匿名游标用法:' || preod_rec.empno || ' ' || preod_rec.ename);
END LOOP;
end;
/*
隐式游标
如前所述,DML操作和单行SELECT语句会使用隐式游标,它们是:
* 插入操作:INSERT。
* 更新操作:UPDATE。
* 删除操作:DELETE。
* 单行查询操作:SELECT ... INTO ...。
当系统使用一个隐式游标时,可以通过隐式游标的属性来了解操作的状态和结果,
进而控制程序的流程。隐式游标可以使用名字SQL来访问,
但要注意,通过SQL游标名总是只能访问前一个DML操作或单行SELECT操作的游标属性。
所以通常在刚刚执行完操作之后,立即使用SQL游标名来访问属性。
游标的属性有四种,如下所示。
Sql代码
隐式游标的属性 返回值类型 意 义
SQL%ROWCOUNT 整型 代表DML语句成功执行的数据行数
SQL%FOUND 布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功
SQL%NOTFOUND 布尔型 与SQL%FOUND属性返回值相反
SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假
*/