《PL/SQL 语言开发参考手册》之五:PL/SQL 游标

《PL/SQL 语言开发参考手册》之五:PL/SQL 游标

《PL/SQL 语言开发参考手册》下载地址
        1、游标(CURSOR)
        游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用 fetch 语句可以移动该指针,从而对游标中的数据进行各种操作,然后将操作结果写回数据表中。
                1)分类:
                        a)显式游标:程序员可以操作控制,是针对 select 语句的,指向 select 语句的结束集;
                        b)隐式游标:程序员不可控制,但可以有限制的应用;
                2)作用:用于处理查询语句的结果,提取多行数据集;
                3)使用步骤:
                        a)声明游标:
                                a、普通声明:

DELCARE v_emp s_emp%ROWTYPE; v_did s_dept.id%TYPE; CURSOR cur_emp IS select * FROM s_emp WHERE dept_id =v_did; /* CURSOR的内容必须是一条查询语句 */  
                                b、带参数声明明:

DELCARE CURSOR c_emp(v_did s_emp.ID%TYPE) SELECT * FROM s_emp WHERE dept_id = v_did;  
                        b)为查询打开游标:

OPEN cur_emp; /* 相当于执行select语句,且把执行结果存入CURSOR;  
                        c)从游标中取结果,存入 PL/SQL 变量中:
                                a、FETCH cur_emp INTO var1, var2, ...(变量名 1, 变量名 2,.......);     /* 变量的数量、类型、顺序要和Table中字段一致; */
                                b、FETCH cur_emp INTO record_var(记录型变量名);
                        注:将值从 CURSOR 取出放入变量中,每 FETCH 一次取一条记录;
                        d)关闭游标:CLOSE cur_emp;
                        注:
                                a、游标使用后应该关闭;
                                b、关闭后的游标不能 FETCH 和再次 CLOSE;
                                c、关闭游标相当于将内存中 CURSOR 的内容清空;
        2、游标的属性
        游标名%属性名
                1)%FOUND:是否有值;有则返回 TRUE,否则返回 FALSE;
                2)%NOTFOUND:是否没有值;如果没有值则返回 TRUE,否则返回 FALSE;
                3)%ISOPEN:是否是处于打开状态;处于打开状态就返回 TRUE,否则返回 FALSE;
                4)%ROWCOUNT:CURSOR 当前的记录号(当前游标的指针位移量,表示在此之前,游标所处理的数据量(多少条记录));
        3、游标的 FETCH 循环
                1)

LOOP FETCH 游标名 INTO 定义的变量 EXIT WHEN 游标名%NOTFOUND; /* 当游标没取道记录后退出 要及时的做出判断 */ END LOOP;  
                2)

WHILE 游标名%FOUND LOOP FETCH 游标名 INTO 定义的变量; END LOOP;  
                3)

FOR 保存数据的变量(不用事先定义,是根据游标声明的时候SELECT 的类型来确定) IN 游标名 LOOP (FETCH 游标名 INTO ...) (可以不用FETCH 语句) END LOOP;  
        4、带参数的游标 CURSOR

DECLARE v_emp s_emp%ROWTYPE CURSOR cur_emp(p_did s_emp.dept_id%TYPE) IS /* 定义参数p_did的类型 */ SELECT * FROM s_emp WHERE dept_id= p_did FOR UPDATE OF salary; /*FOR UPDATE OF salary; 加行级锁,在我修改这些数据的时候, *其他人无法修改数据,直到游标被CLOSE后 */ BEGIN OPEN cur_emp(31); /*带的参数值 31 就是赋给参数p_did 的 */ LOOP FETCH cur_emp INTO v_emp; EXIT WHEN cur_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_emp.id||' '||v_emp.first_name); END LOOP; CLOSE cur_emp; END 
        5、显式游标与隐式游标
        显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;
        而对于非查询语句,如修改、删除操作,则由 ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为 SQL,这是由 ORACLE 系统定义的。
        对于隐式游标的操作,如定义、打开、取值及关闭操作,都由 ORACLE 系统自动地完成,无需用户进行处理。
        用户只能通过隐式游标的相关属性,来完成相应的操作。
        在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条 SQL 语句所包含的数据。
        格式调用为: SQL%
        注:INSERT,UPDATE,DELETE,SELECT 语句中不必明确定义游标。
        隐式游标属性
                SQL%FOUND       布尔型属性,当最近一次读记录时成功返回,则值为 true;
                SQL%NOTFOUND   布尔型属性,与 %found 相反;
                SQL %ROWCOUNT 数字型属性,返回已从游标中读取得记录数;
                SQL %ISOPEN    布尔型属性,取值总是 FALSE。SQL 命令执行完毕立即关闭隐式游标。

你可能感兴趣的:(oracle,sql,工作,delete,insert,语言)