2022年游标使用方法_语法 .pdf
《2022年游标使用方法_语法 .pdf》由会员分享,可在线阅读,更多相关《2022年游标使用方法_语法 .pdf(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Oracle 游标使用方法及语法大全当查询返回结果超过一行时,就需要一个显式游标,此时用户不能使用select into语句。PL/SQL 管理 隐式游标 ,当查询开始时隐式游标打开,查询结束时隐式游标自动关闭。显式游标 在 PL/SQL块的声明部分声明,在执行部分或异常处理部分打开,取出数据, 关闭。使用游标语法:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 48 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - -
2、 - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 48 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 48 页 - - - - - - - - - 例: SET SERVERIUTPUT ON DECLARE R_emp EMP%ROWTYPE; CURSOR c_emp IS select * from emp; BEGIN OPEN c_emp; Loop FETCH
3、c_emp into r_emp; EXIT WHEN C_EMP%NOTFOUND; is ) End loop; Close c_emp; End; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 48 页 - - - - - - - - - %ROWTYPE也可以用游标名来定义,这样的话就必须要首先声明游标:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
4、5 页,共 48 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 48 页 - - - - - - - - - For record_name IN(corsor_name(parameter,parameter,) |(query_difinition) loop Statements End loop; 下面我们用for循环重写上面的例子:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
5、- - - - - - 名师精心整理 - - - - - - - 第 7 页,共 48 页 - - - - - - - - - 在游标 FOR循环中使用查询在游标 FOR循环中可以定义查询,由于没有显式声明所以游标没有名字,记录名通过游标查询来定义。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 48 页 - - - - - - - - - 游标中的子查询语法如下:可以看出与SQL中的子查询有没什么区别。游标中的更新和删除在 PL/SQL中依然可以使用UPDATE 和 D
6、ELETE 语句更新或删除数据行。显示游标只有在需要获得多行数据的情况下使用。PL/SQL 提供了仅仅使用游标就可以执行删除或更新记录的方法。UPDATE 或 DELETE 语句中的WHERE CURRENT OF子串专门处理要执行UPDATE 或 DELETE 操作的表中取出的最近的数据。要使用这个方法,在声明游标时必须使用FOR UPDATE 子串,当对话使用 FOR UPDATE 子串打开一个游标时, 所有返回集中的数据行都将处于行级( ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,不能进行UPDATE 、DELETE或 SELECT.FOR UPDATE 操作。语法:名师
7、资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 48 页 - - - - - - - - - 在多表查询中, 使用 OF自居来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经被其他会话锁定,那么正常情况下oracle将等待,直到数据行解锁。在 UPDATE 和 DELETE 中使用 WHERE CURRENT OF子串的语法如下:WHERE CURRENT OF cursor_name|search_condition 实例 : DEL
8、CARE CURSOR c1 IS SELECT empno,salary FROM emp WHERE comm IS NULL FOR UPDATE OF comm; v_comm NUMBER(10,2); BEGIN FOR r1 IN c1 LOOP IF r1.salary500 THEN v_comm:=r1.salary*0.25; ELSEIF r1.salary1000 THEN v_comm:=r1.salary*0.20; ELSEIF r1.salary3000 THEN v_comm:=r1.salary*0.15; ELSE v_comm:=r1.salary*0
9、.12; END IF; UPDATE emp SET comm=v_comm WHERE CURRENT OF c1; END LOOP; END = oracle 隐式游标 , 显示游标 , 游标循环动态 SELECT 语句和动态游标, 异常处理 , 自定义异常游标的概念 : 游标是 SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下, 需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。游标有两种类型:显式游标和隐式游标
10、。在前述程序中用到的SELECT.INTO.查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。 但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应一个返回结果为多行多列的SELECT 语句。游标一旦打开, 数据就从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 48 页 - - - - - -
11、 - - - 隐式游标:如前所述, DML操作和单行SELECT 语句会使用隐式游标,它们是:* 插入操作: INSERT 。* 更新操作: UPDATE 。* 删除操作: DELETE 。* 单行查询操作:SELECT . INTO .。当系统使用一个隐式游标时,可以通过隐式游标的属性来了解操作的状态和结果,进而控制程序的流程。 隐式游标可以使用名字SQL来访问, 但要注意, 通过 SQL游标名总是只能访问前一个 DML操作或单行SELECT 操作的游标属性。所以通常在刚刚执行完操作之后,立即使用 SQL游标名来访问属性。游标的属性有四种,如下所示。Sql 代码:隐式游标的属性返回值类型意义
12、SQL%ROWCOUNT 整型代表 DML语句成功执行的数据行数SQL%FOUND 布尔型值为 TRUE代表插入、删除、更新或单行查询操作成功SQL%NOTFOUND 布尔型与 SQL%FOUND属性返回值相反SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假【训练 1】使用隐式游标的属性,判断对雇员工资的修改是否成功。步骤 1:输入和运行以下程序:Sql 代码: SET SERVEROUTPUT ON BEGIN UPDATE emp SET sal=sal+100 WHERE empno=1234; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE(
13、成功修改雇员工资!); COMMIT; ELSE DBMS_OUTPUT.PUT_LINE(修改雇员工资失败!); END IF; END; 运行结果为:Sql 代码:修改雇员工资失败!PL/SQL 过程已成功完成。步骤 2:将雇员编号1234 改为 7788,重新执行以上程序:运行结果为:Sql 代码:成功修改雇员工资!PL/SQL 过程已成功完成。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 48 页 - - - - - - - - - 说明:本例中,通过SQL%
14、FOUND属性判断修改是否成功,并给出相应信息。显式游标:游标的定义和操作游标的使用分成以下4 个步骤。1声明游标在 DECLEAR 部分按以下格式声明游标:CURSOR 游标名 ( 参数 1 数据类型 ,参数 2 数据类型 .) IS SELECT 语句 ; 参数是可选部分, 所定义的参数可以出现在SELECT 语句的 WHERE 子句中。 如果定义了参数,则必须在打开游标时传递相应的实际参数。SELECT 语句是对表或视图的查询语句,甚至也可以是联合查询。可以带WHERE 条件、 ORDER BY或 GROUP BY等子句,但不能使用INTO子句。在SELECT 语句中可以使用在定义游标之
15、前定义的变量。2打开游标在可执行部分,按以下格式打开游标:OPEN 游标名 ( 实际参数1 ,实际参数2.); 打开游标时, SELECT 语句的查询结果就被传送到了游标工作区。3提取数据在可执行部分, 按以下格式将游标工作区中的数据取到变量中。提取操作必须在打开游标之后进行。FETCH 游标名 INTO 变量名 1 ,变量名2.; 或FETCH 游标名 INTO 记录变量 ; 游标打开后有一个指针指向数据区,FETCH语句一次返回指针所指的一行数据,要返回多行需重复执行,可以使用循环语句来实现。控制循环可以通过判断游标的属性来进行。下面对这两种格式进行说明:第一种格式中的变量名是用来从游标中
16、接收数据的变量,需要事先定义。 变量的个数和类型应与 SELECT 语句中的字段变量的个数和类型一致。第二种格式一次将一行数据取到记录变量中,需要使用%ROWTYPE事先定义记录变量,这种形式使用起来比较方便,不必分别定义和使用多个变量。定义记录变量的方法如下:变量名表名 | 游标名 %ROWTYPE;其中的表必须存在,游标名也必须先定义。4关闭游标CLOSE 游标名 ; 显式游标打开后,必须显式地关闭。游标一旦关闭,游标占用的资源就被释放,游标变成无效,必须重新打开才能使用。以下是使用显式游标的一个简单练习。【训练 1】用游标提取emp表中 7788 雇员的名称和职务。Sql 代码: SET
17、 SERVEROUTPUT ON DECLARE 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 48 页 - - - - - - - - - v_ename VARCHAR2(10); v_job VARCHAR2(10); CURSOR emp_cursor IS SELECT ename,job FROM emp WHERE empno=7788; BEGIN OPEN emp_cursor; FETCH emp_cursor INTO v_ename,v_job
18、; DBMS_OUTPUT.PUT_LINE(v_ename|,|v_job); CLOSE emp_cursor; END; 执行结果为 : Sql 代码:SCOTT,ANALYST PL/SQL 过程已成功完成。说明:该程序通过定义游标emp_cursor ,提取并显示雇员7788 的名称和职务。作为对以上例子的改进,在以下训练中采用了记录变量。【训练 2】用游标提取emp表中 7788 雇员的姓名、职务和工资。Sql 代码:SET SERVEROUTPUT ON DECLARE CURSOR emp_cursor IS SELECT ename,job,sal FROM emp WHER
19、E empno=7788; emp_record emp_cursor%ROWTYPE; BEGIN OPEN emp_cursor; FETCH emp_cursor INTO emp_record; DBMS_OUTPUT.PUT_LINE(emp_record.ename|,| emp_record.job|,| emp_record.sal); CLOSE emp_cursor; END; 执行结果为 : Sql 代码:SCOTT,ANALYST,3000 PL/SQL 过程已成功完成。说明: 实例中使用记录变量来接收数据,记录变量由游标变量定义,需要出现在游标定义之后。注意:可通过以
20、下形式获得记录变量的内容:记录变量名 . 字段名。【训练 3】显示工资最高的前3 名雇员的名称和工资。Sql 代码:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 48 页 - - - - - - - - - SET SERVEROUTPUT ON DECLARE V_ename VARCHAR2(10); V_sal NUMBER(5); CURSOR emp_cursor IS SELECT ename,sal FROM emp ORDER BY sal DESC;
21、 BEGIN OPEN emp_cursor; FOR I IN 1.3 LOOP FETCH emp_cursor INTO v_ename,v_sal; DBMS_OUTPUT.PUT_LINE(v_ename|,|v_sal); END LOOP; CLOSE emp_cursor; END; 执行结果为 : Sql 代码:KING,5000 SCOTT,3000 FORD,3000 PL/SQL 过程已成功完成。说明:该程序在游标定义中使用了ORDER BY 子句进行排序,并使用循环语句来提取多行数据。游标循环【训练 1】使用特殊的FOR循环形式显示全部雇员的编号和名称。Sql 代码S
22、ET SERVEROUTPUT ON DECLARE CURSOR emp_cursor IS SELECT empno, ename FROM emp; BEGIN FOR Emp_record IN emp_cursor LOOP DBMS_OUTPUT.PUT_LINE(Emp_record.empno| Emp_record.ename); END LOOP; END; 执行结果为:Sql 代码7369SMITH 7499ALLEN 7521WARD 7566JONES PL/SQL 过程已成功完成。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
23、- - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 48 页 - - - - - - - - - 说明:可以看到该循环形式非常简单,隐含了记录变量的定义、游标的打开、提取和关闭过程。 Emp_record 为隐含定义的记录变量,循环的执行次数与游标取得的数据的行数相一致。【训练 2】另一种形式的游标循环。Sql 代码SET SERVEROUTPUT ON BEGIN FOR re IN (SELECT ename FROM EMP) LOOP DBMS_OUTPUT.PUT_LINE(re.ename) END LOOP; END; 执行结果为:Sql 代码
24、SMITH ALLEN WARD JONES 说明:该种形式更为简单,省略了游标的定义,游标的SELECT 查询语句在循环中直接出现。显式游标属性虽然可以使用前面的形式获得游标数据,但是在游标定义以后使用它的一些属性来进行结构控制是一种更为灵活的方法。显式游标的属性如下所示。Sql 代码:游标的属性返回值类型意义%ROWCOUNT 整型获得 FETCH 语句返回的数据行数%FOUND 布尔型最近的 FETCH 语句返回一行数据则为真,否则为假%NOTFOUND 布尔型与%FOUND 属性返回值相反%ISOPEN 布尔型游标已经打开时值为真,否则为假可按照以下形式取得游标的属性:游标名 % 属性
25、要判断游标emp_cursor 是否处于打开状态,可以使用属性emp_cursor%ISOPEN 。如果游标已经打开,则返回值为“真”,否则为“假”。具体可参照以下的训练。【训练 1】使用游标的属性练习。Sql 代码SET SERVEROUTPUT ON DECLARE V_ename VARCHAR2(10); CURSOR emp_cursor IS SELECT ename FROM emp; BEGIN 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 48 页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年游标使用方法_语法 2022 游标 使用方法 语法
限制150内