首页 > 经验记录 > PL/SQL 游标简介—隐式游标/显示游标

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号部门
*/

 
 
 

           


CAPTCHAis initialing...
EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00