1、浅谈数据库游标,回顾,CREATE OR REPLACE PROCEDUREpro_Name(参数列表) AS BEGINEXCEPTION WHEN OTHERSTHEN dbms_output.put_line(Sqlerrm);END;,2,目标,掌握游标管理技巧,3,SELECT INTO 语句 2-1,4,SQL SET SERVEROUTPUT ON SQL DECLARE empid VARCHAR2(10);desig VARCHAR2(10);BEGINempid:= /,如果没有与SELECT INTO语句中的条件匹配的行,将引发NO_DATA_FOUND异常,SELECT
2、 INTO 语句 2-2,5,SQL SET SERVEROUTPUT ON SQL DECLARE empid VARCHAR2(10);BEGINSELECT empno INTO empid FROM employee;EXCEPTIONWHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE(该查询提取多行);END;/,如果 SELECT INTO 语句返回多个值, 将引发TOO_MANY_ROWS异常,显式游标 2-1,显式游标在 PL/SQL 块的声明部分定义查询,该查询可以返回多行 显式游标的操作过程:,6,数据库,打开游标,提取行,变量,关闭游标
3、,游标简介 2-1,7,执行 PL/SQL 程序,内存单元,保存到游标中,一次处理一行,检索行,提取行,游标简介 2-2,逐行处理查询结果,以编程的方式访问数据 游标的类型:,8,隐式游标,REF 游标,显式游标,在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标。,显式游标用于处理返回多行的查询。,REF 游标用于处理运行时才能确定的动态 SQL 查询的结果,游标类型,显式游标 2-2,9,SQLSET SERVER OUTPUT ON SQLDECLAREmy_toy_price toys.toyprice%TYPE; CURSOR toy_cur ISSELECT toy
4、price FROM toysWHERE toyprice250;BEGINOPEN toy_cur; LOOPFETCH toy_cur INTO my_toy_price;EXIT WHEN toy_cur%NOTFOUND;DBMS_OUTPUT.PUT_LINE (TOYPRICE=:玩具单价=:|my_toy_price);END LOOP;CLOSE toy_cur;END;,声明游标,打开游标,提取行,关闭游标,带参数的显式游标,声明显式游标时可以带参数以提高灵活性 声明带参数的显式游标的语法如下:CURSOR ( )IS select_statement;,10,SQL SET
5、 SERVEROUTPUT ON SQL DECLAREdesig VARCHAR2(20);emp_code VARCHAR2(5);empnm VARCHAR2(20);CURSOR emp_cur(desigparam VARCHAR2) ISSELECT empno, ename FROM employeeWHERE designation=desigparam;BEGINdesig:= ,循环游标 2-1,循环游标用于简化游标处理代码 当用户需要从游标中提取所有记录时使用 循环游标的语法如下:,11,FOR IN LOOPEND LOOP;,循环游标 2-2,12,SQL SET S
6、ERVER OUTPUT ON SQL DECLARE CURSOR mytoy_cur ISSELECT toyid, toyname, toypriceFROM toys;BEGINFOR toy_rec IN mytoy_curLOOPDBMS_OUTPUT.PUT_LINE(玩具编号:| |toy_rec.toyid| |玩具名称:| |toy_rec.toyname| |玩具单价:| |toy_rec.toyprice);END LOOP;END;,REF 游标和游标变量 3-1,REF 游标和游标变量用于处理运行时动态执行的 SQL 查询 创建游标变量需要两个步骤: 声明 REF
7、游标类型 声明 REF 游标类型的变量 用于声明 REF 游标类型的语法为:TYPE IS REF CURSORRETURN ;,13,REF 游标和游标变量 3-2,打开游标变量的语法如下:OPEN cursor_name FOR select_statement;,14,TYPE my_curtype IS REF CURSORRETURN stud_det%ROWTYPE; order_cur my_curtype;,声明强类型的 REF 游标,TYPE my_ctype IS REF CURSOR; stud_cur my_ctype;,声明弱类型的 REF 游标,REF 游标和游标变
8、量 3-3,15,SQL DECLARE TYPE toys_curtype IS REF CURSORRETURN toys%ROWTYPE;toys_curvar toys_curtype;toys_rec toys%ROWTYPE;BEGINOPEN toys_curvar FORSELECT * FROM toys;FETCH toys_curvar INTO toys_rec;.CLOSE toys_curvar;END;,声明REF游标类型,声明游标变量,游标变量的优点,游标变量的功能强大,可以简化数据处理。 游标变量的优点有: 可从不同的 SELECT 语句中提取结果集 可以作为
9、过程的参数进行传递 可以引用游标的所有属性,16,使用游标变量执行动态 SQL,可以使用游标变量执行动态构造的 SQL 语句 打开执行动态 SQL 的游标变量的语如下:OPEN cursor_name FOR dynamic_sqlstringUSING bind_argument_list;,17,DECLAREr_emp emp%ROWTYPE;TYPE c_type IS REF CURSOR;cur c_type;p_salary NUMBER; BEGINp_salary := 2500;OPEN cur FOR select * from emp where sal:1order
10、by sal descUSING p_salary;DBMS_OUTPUT.PUT_LINE(薪水大于| p_salary |的员工有:);LOOPFETCH cur INTO r_emp;EXIT WHEN cur%NOTFOUND;DBMS_OUTPUT.PUT_LINE(编号:| r_emp.empno| 姓名: | r_emp.ename| 薪水: | r_emp.sal );END LOOP;CLOSE cur; END;,隐式游标 4-1,在PL/SQL中使用DML语句时自动创建隐式游标 隐式游标自动声明、打开和关闭,其名为 SQL 通过检查隐式游标的属性可以获得最近执行的DML
11、语句的信息 隐式游标的属性有: %FOUND SQL 语句影响了一行或多行时为 TRUE %NOTFOUND SQL 语句没有影响任何行时为TRUE %ROWCOUNT SQL 语句影响的行数 %ISOPEN - 游标是否打开,始终为FALSE,18,隐式游标 4-2,19,SQL SET SERVEROUTPUT ON SQL BEGINUPDATE toys SET toyprice=270WHERE toyid= P005;IF SQL%FOUND THENDBMS_OUTPUT.PUT_LINE(表已更新);END IF;END;/,只有在 DML 语句影响一行 或多行时,才返回 Tr
12、ue,隐式游标 4-3,20,SQL SET SERVEROUTPUT ON SQL DECLAREv_TOYID TOYS.ID%type := /,如果 DML 语句不影响任何行,则返回 True,隐式游标 4-4,21,SQL SET SERVEROUTPUT ON SQL BEGINUPDATE vendor_masterSET venname= Rob MathewWHERE vencode=V004;DBMS_OUTPUT.PUT_LINE (SQL%ROWCOUNT);END;/,返回 DML 语句影响的行数,总结,游标用于处理查询结果集中的数据 游标类型有:隐式游标、显式游标和 REF 游标 隐式游标由 PL/SQL 自动定义、打开和关闭 显式游标用于处理返回多行的查询 要处理结果集中所有记录时,可使用循环游标 在声明 REF 游标时,不需要将 SELECT 语句与 其关联,22,