目录
一、目标
1、理解游标的含义
2、掌握oracle11g中的三类游标的使用方式
3、掌握oracle11g中使用fetch ... bulk collect into进行批量、快速提取数据的方式
4、能够根据不同情况,选取不同的游标进行使用
二、游标简介
三、游标简介2
1、逐行处理查询结果,以编程的方式访问数据
2、游标的类型:
(1)隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标,名字固定叫sql,不区分大小写。
(2)显式游标:显式游标用于处理返回多行的查询。
(3)REF 游标(参照游标):REF 游标用于处理运行时才能确定的动态 SQL 查询的结果
四、隐式游标
1、在PL/SQL中使用DML语句时自动创建隐式游标
2、隐式游标自动声明、打开和关闭,名字固定为 SQL,
3、通过检查隐式游标的属性 可以获得最近执行的DML 语句的信息
4、隐式游标的属性有:
(1)%FOUND – SQL 语句影响了一行或多行时为 TRUE
(2)%NOTFOUND – SQL 语句没有影响任何行时为TRUE
(3)%ROWCOUNT – SQL 语句影响的行数
(4)%ISOPEN - 游标是否打开,始终为FALSE
(5)测试
只有在 DML 语句影响一行或多行时,才返回 True
SQL> SET SERVEROUTPUT ON
SQL>
BEGIN
UPDATE toys SET toyprice=270
WHERE toyid= 'P005';
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘表已更新');
END IF;
END;
/
五、select into 语句的异常
1、NO_DATA_FOUND
2、TOO_MANY_ROWS
六、显式游标
1、sqlserver和oracle游标使用流程
SQLSERVER:声明游标、打开游标、使用游标取出记录、关闭游标、deallocate丢弃游标
ORACLE:声明游标、打开游标、使用游标取出记录、关闭游标
2、普通游标使用
3、带参游标的使用
七、使用显示游标更新行
1、允许使用游标删除或更新活动集中的行
2、声明游标时必须使用 SELECT … FOR UPDATE语句
3、语法:
(1)更新的语法
CURSOR <cursor_name> IS SELECT statement FOR UPDATE; UPDATE <table_name> SET <set_clause> WHERE CURRENT OF <cursor_name>
(2)删除的语法
CURSOR <cursor_name> IS SELECT statement FOR UPDATE; DELETE FROM <table_name> WHERE CURRENT OF <cursor_name>
八、循环游标
1、循环游标用于简化游标处理代码
2、当用户需要从游标中提取所有记录时使用
3、循环游标的语法如下:
FOR <record_index> IN <cursor_name> LOOP <executable statements> END LOOP;
4、缺点:只能用于查询使用
九、Oracle11g的fetch ... bulk collect into
【此方法要远远快于fetch into的方法,尤其是几百万行,几千万行的数据】
declare cursor my_cursor is select ename from emp where deptno=10; type ename_table_type is table of varchar2(10); ename_table ename_table_type; begin open my_cursor; fetch my_cursor bulk collect into ename_table; for i in 1..ename_table.count loop dbms_output.put_line(ename_table(i)); end loop; close my_cursor; end;
十、显式游标题目
1、已建立表,如下:
create table student (xh number, xm varchar2(10)); insert into student values(1,'A'); insert into student values(2,'B'); insert into student values(3,'C'); insert into student values(4,'D'); create table address (xh number, zz varchar2(10)); insert into address values(2,'郑州'); insert into address values(1,'开封'); insert into address values(3,'洛阳'); insert into address values(4,'新乡');
2、完成的任务:
给表student添加一列zz,是varchar2(10)类型;再从address中,将zz字段的数值取出来,对应的插入到
student新增的zz列中。
即:得到的结果:student表中,是:
XH XM ZZ -- ---------- ------ 1 A 开封 2 B 郑州 3 C 洛阳 4 D 新乡
或直接用sql语句:【上述只是用于游标的练习】
update student set zz=(select zz from address where address.xh=student.xh);
十一、REF游标(参照游标)
1、REF 游标和游标变量用于处理运行时动态执行的 SQL 查询
2、创建游标变量需要两个步骤:
(1)声明 REF 游标类型
(2)声明 REF 游标类型的变量
3、用于声明 REF 游标类型的语法为:
TYPE <ref_cursor_name> IS REF CURSOR
[RETURN <return_type>];
4 、打开游标变量的语法如下
OPEN cursor_name FOR select_statement;
5、举例:
文章评论