Session Cursor的种类和用法

Oracle数据库里的Session Cursor 又细分为三种类型,分别是 **隐式游标(Implicit Cursor)、
显示游标(explicit Cursor) 参考游标(ref cursor)**

隐式游标:

隐式游标是Oracle中最常见的游标,当我们执行sql 或者plsql时,Oracle都会自动帮我们创建隐式游标。之所以称为隐式游标,是因为它的生命周期: open parse bind exectue fetch
close全部是由sql引擎或者plsql引擎自动完成的。

Oracle数据库的隐式游标有以下四种:
SQL%FOUND
SQL%NOTFOUND
SQL%ISOPEN
SQL%ROWCOUNT

SQL%FOUND 表示一条sql语句被执行成功后,受其影响而改变的记录数是否大于等于1. 因此SQL%FOUND通常用于执行INSERT UPDATE DELETE 和SELECT INTO。

在一条DML语句在执行之前 SQL%FOUND的值为NULL,当这条sql语句执行成功以后,如果改变的记录条数大于等于1,那么SQL%FOUND的值为true。否则为false。

当使用SELECT INTO时,当且仅当对应的SELECT 语句的返回结果只有一条记录时,SQL%FOUND的值才是true。当返回的结果为0时,Oracle会报错: NO_DATA_FOUND ,如果SELECT INTO返回的结果大于1,则Oracle会报错“TOO_MANY_ROWS”.

SQL%NOTFOUND 表示一条sql语句被执行成功之后,受其影响而改变的记录数是否为0,如果是0,那么SQL%NOTFOUND的值为true,否则为false。

SQL%OPEN 表示隐式游标是否处于开启状态。对于隐式游标而言 其值永远为false。

SQL%ROWCOUNT 表示一条sql语句成功执行后,受其影响而改变的记录的数量。

当SELECT INTO语句返回超过一条以上的记录时,Oracle会报错 TOO_MANY_ROWS,这种情况下SQL%ROWCOUNT的值1,而不是SELECT INTO语句所有对应的SELECT返回的记录数。

显示游标(Explicit Cursor)是Oracle数据库中另外一种类型的Session Cursor,它通常用于plsql代码,之所以成为“显示游标”,是因为其定义和声明周期管理中的OPEN FETCH CLOSE均由我们在plsql中控制。

Oracle的显示游标也有四个如下属性:
(CURSORNAME是我们在plsq代码中自定义的显示游标的名称)

CURSORNAME%FOUND
CURSORNAME%NOTFOUND
CURSORNAME%ISOPEN
CURSORNAME%ROWCOUNT

CURSORNAME%FOUND 表示指定的游标是否至少有一条记录被fetch了。

当一个显示游标被Open以后,如果还一次都没被Fetch,那么CURSORNAME%FOUND的值就是null,当这个显示游标被Fetch后,CURSORNAME%FOUND的值为true,直到全部Fetch完毕。而全部Fetch完毕后,如果在执行一次Fetch操作,Oracle不会报错,但是CURSORNAME%FOUND的值变成了false。

CURSORNAME%ISOPEN 表示指定的显示游标是否被OPen了。主要用于异常流中。

CURSORNAME%NOTFOUND表示指定的游标是否已经Fetch完毕了。

CURSORNAME%NOTFOUND在语义上和CURSORNAME%FOUND完全相反。 当一个显示游标被OPEN以后,如果还一次都没用Fetch,那么CURSORNAME%NOTFOUND的值是NULL。当这个显示游标Fetch以后,CURSORNAME%NOTFOUND的值为False,知道全部Fetch完毕。全部Fetch完毕后,如果这个时候再进行Fetch,那么CURSORNAME%NOTFOUND的值为TRUE。

CURSORNAME%ROWCOUNT 表示指定的显示游标迄今为止一共Fetch了多少行记录。

PLSQL代码 显示游标的标准用法:

create or replace procedure  P_DEMO_EXPLICIT_CURSOR_STD  is

  cursor cl is select * from emp where rownum < 12;
  emp_rec emp%rowtype;

begin
  open c1;
  fetch c1 into emp_rec;
  while (cl%found) loop
    dbms_output.put_line('name='||emp_rec.enmae||',salary='||emp.rec.sal);

    fetch cl into emp_rec;
    end loop;
    close c1;
   exception
      when others then
        --o_parm:='E'||sqlcode||sqlerrm;
        rollback;
        --写日志
        return;

  end P_DEMO_EXPLICIT_CURSOR_STD;
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

以下几点需要注意:
1 显示游标的标准用法是先OPEN,再Fetch,然后用一个while循环处理数据,最后是close。
2 在上述显示游标的标准用法的while循环内部处理晚一条记录后,一定要记得执行fetch操作以跳到下一条记录,否则就是死循环。

Oracle数据库里的Session Cursor 又细分为三种类型,分别是 **隐式游标(Implicit Cursor)、
显示游标(explicit Cursor) 参考游标(ref cursor)**

猜你喜欢

转载自blog.csdn.net/huiyeyeyey/article/details/82771647