PL/SQL 游标简介—隐式游标/显示游标
在Oraacle数据库之中,游标分为以下两种类型:
静态游标:结果集已存在(静态定义)的游标。分为隐式和显示
隐式游标:所有DML语句为隐式游标,通过隐式游标属性可以获取SQL语句信息
显示游标:用户显示声明的游标,即指定结果集。当返回结果超过一行时,就需要一个显示游标
REF游标:动态管理连结果集的临时对象
隐式游标
在PL/SQL块之中所编写的每条sql语句实际上就是隐式游标。通过在DML操作之后使用“SQL%ROWCOUNT”属性,可以知道语句所改变的行数(INSERT、UPDATE、DELETE返回更新行数,SELECT返回查询行数)
隐式游标属性:
NO. | 属性 | 描述 |
1 | %FOUND | 当用户使用DML操作数据时,该属性返回TRUE |
2 | %ISOPEN | 判断游标是否打开,该属性对于任何的隐式游标总是返回FALSE,表示已经打开 |
3 | %NOTFOUND | 如果执行DML操作时没有返回的数据行,返回TRUE,否则返回FALSE |
4 | %ROWCOUNT | 返回更新的操作的行数或SELECT INTO返回的行数 |
显示游标
隐式游标是用户操作SQL时自动生成的,而显示游标指的是在声明快中直接定义的游标,而在每一个游标之中,都会保存SELECT查询后的返回结果,显示游标的创建语法如下:
创建显示游标语法
CURSOR 游标名称([参数列表]) [RETURN 返回值类型]
IS 子查询
[FOR UPDATE (OF 数据列,数据列,)] [NOWAIT]
在PL/SQL中显示游标的操作步骤如下:
第一步: 声明游标(CURSOR 游标名称 IS 查询语句)。 使用CURSOR定义;
第二步: 为查询打开游标(语法:OPEN 游标名称)。使用OPEN操作,当游标打开时会首先检查绑定此游标的变量内容,之后在确定所使用的查询结果集,最后游标将指针指向结果集的第一行。如果用户定义的是一个带参数的游标,则会在打开游标时为游标设置指定的参数值;
第三步: 取得结果放入PL/SQL变量中(语法:FETCH 游标名称 INTO ROWTYP变量)。使用循环和FETCH…INTO…操作;
第四步: 关闭游标(语法: CLOSE 游标名称)。使用CLOSE操作。
显示游标属性:
NO. | 属性 | 描述 |
1 | %FOUND | 光标打开后未曾执行FETCH,则值为NULL;如果最近一次在该光标上执行的FETCH返回一行,则值为TRUE,否则为FALSE。 |
2 | %ISOPEN | 如果该光标是打开状态值为TRUE,否贼为FALSE |
3 | %NOTFOUND | 如果该光标最近一次FETCH语句没有返回行,则值为TRUE。否则为FALSE。如果光标刚刚打开还未执行FETCH,则值为NULL |
4 | %ROWCOUNT | 其值在该光标上到目前为止执行FETCH语句所返回的行数。光标打开时,%ROWCOUNT初始化为零,每执行一次FETCH如果返回一行则%ROWCOUNT增加1 |
显示游标代码示例:
DECLARE CURSOR cur_yb IS SELECT * FROM emp_pyb; i emp_pyb%ROWTYPE; BEGIN /*IF cur_yb%ISOPEN THEN NULL; ELSE OPEN cur_yb; END IF;*/ FOR i IN cur_yb LOOP DBMS_OUTPUT.PUT_LINE('员工编号为:'||i.empno||',姓名为:'||i.ename|| ',工资为:'||i.sal||',所在部门为'||i.deptno||'号部门'); END LOOP; END; / /* 输出结果: 员工编号为:7369,姓名为:SMITH,工资为:800,所在部门为20号部门 员工编号为:7499,姓名为:ALLEN,工资为:1600,所在部门为30号部门 员工编号为:7521,姓名为:WARD,工资为:1250,所在部门为30号部门 员工编号为:7566,姓名为:JONES,工资为:2975,所在部门为20号部门 员工编号为:7654,姓名为:MARTIN,工资为:1250,所在部门为30号部门 员工编号为:7698,姓名为:BLAKE,工资为:2850,所在部门为30号部门 员工编号为:7782,姓名为:CLARK,工资为:2450,所在部门为10号部门 员工编号为:7788,姓名为:SCOTT,工资为:3000,所在部门为20号部门 员工编号为:7839,姓名为:KING,工资为:5000,所在部门为10号部门 员工编号为:7844,姓名为:TURNER,工资为:1500,所在部门为30号部门 员工编号为:7876,姓名为:ADAMS,工资为:1100,所在部门为20号部门 员工编号为:7900,姓名为:JAMES,工资为:950,所在部门为30号部门 员工编号为:7902,姓名为:FORD,工资为:3000,所在部门为20号部门 员工编号为:7934,姓名为:MILLER,工资为:1300,所在部门为10号部门 */