PLSQL中显示游标使用的4个步骤

发表于:2012-9-20 09:53

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:kkdelta    来源:51Testing软件测试网采编

  本例简单介绍一下游标处理的4个过程中涉及到的加锁,一致性读的问题.

  显式游标处理需四个 PL/SQL步骤:

  1、定义/声明游标:就是定义一个游标名,以及与其相对应的SELECT 语句。

  格式:

    CURSOR cursor_name[(parameter[, parameter]…)]
           [RETURN datatype]
    IS
        select_statement;

  游标参数只能为输入参数,其格式为:

  parameter_name [IN] datatype [{:= | DEFAULT} expression]

  在指定数据类型时,不能使用长度约束。如NUMBER(4),CHAR(10) 等都是错误的。

  [RETURN  datatype]是可选的,表示游标返回数据的数据。如果选择,则应该严格与select_statement中的选择列表在次序和数据类型上匹配。一般是记录数据类型或带“%ROWTYPE”的数据。

  2、打开游标:就是执行游标所对应的SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有FOR UPDATE选项,OPEN 语句还将锁定数据库表中游标结果集合对应的数据行。

  格式:

  OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];

  在向游标传递参数时,可以使用与函数参数相同的传值方法,即位置表示法和名称表示法。PL/SQL 程序不能用OPEN 语句重复打开一个游标。

  3、提取游标数据:就是检索结果集合中的数据行,放入指定的输出变量中。

  格式:

  FETCH cursor_name INTO {variable_list | record_variable };

  执行FETCH语句时,每次返回一个数据行,然后自动将游标移动指向下一个数据行。当检索到最后一行数据时,如果再次执行FETCH语句,将操作失败,并将游标属性%NOTFOUND置为TRUE。所以每次执行完FETCH语句后,检查游标属性%NOTFOUND就可以判断FETCH语句是否执行成功并返回一个数据行,以便确定是否给对应的变量赋了值。

  4关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH 语句取其中数据。关闭后的游标可以使用OPEN 语句重新打开。

  格式:

  CLOSE cursor_name;

  下面用一个例子来说明:

CREATE OR REPLACE PROCEDURE testcur IS
  CURSOR c_cursor(r_no NUMBER DEFAULT 5)IS
    SELECT ISBN, TITLE
      FROM BOOKS
&nbsp;&nbsp;&nbsp;&nbsp; WHERE rownum < r_no
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOR UPDATE;
&nbsp; v_isbn BOOKS.ISBN%TYPE;
&nbsp; v_title&nbsp;&nbsp; BOOKS.TITLE%TYPE;

BEGIN
&nbsp; --OPEN c_cursor(5);
&nbsp; OPEN c_cursor(r_no=>7);
&nbsp; DBMS_OUTPUT.PUT_LINE('opened cursor'); --afater open
&nbsp; --DBMS_LOCK.SLEEP(30);

&nbsp; FETCH c_cursor
&nbsp;&nbsp;&nbsp; INTO v_isbn, v_title;
&nbsp; DBMS_OUTPUT.PUT_LINE('fetched cursor');
&nbsp; --DBMS_LOCK.SLEEP(30);
&nbsp; WHILE c_cursor%FOUND LOOP
&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.PUT_LINE(v_isbn || '---' || to_char(v_title));
&nbsp;&nbsp;&nbsp; FETCH c_cursor
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTO v_isbn, v_title;
&nbsp; END LOOP;
&nbsp; CLOSE c_cursor;
&nbsp; DBMS_OUTPUT.PUT_LINE('closed cursor');
&nbsp; ROLLBACK;
&nbsp; DBMS_OUTPUT.PUT_LINE('ended transaction');
END testcur;

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号