3、显式游标。

1)、声明显式游标:

  CURSOR cursor_name [([parameter,....)]--参数列表

  [Return return_specification]------可选的Return子句

  IS Select_statement -----任意有效的SQL Select语句

    [For Update [OF [column_list]]];

如:不带参数的游标:Cursor company_cur is Select Company_id from Company;

  带参数的游标:Cursor name_cur (company_id_in In Number)

         Is

           Select name from company Where company_id = company_id_in;

  带有Return子句的游标:Cursor emp_cur Return employees%ROWTYPE---Return子句返回的类型都是%ROWTYPE类型的记录类型或者是自定义的记录类型

                Is

               Select * from employees where department_id=10;

游标不能赋值,只能Open、Fetch、Close语句中通过名字来引用显式游标。

在包中声明游标:

  Package book_info

  Is

    Cursor books_cur(title_filter_in In books.title%TYPE)

      return books%ROWTYPE;

  End

 

  Package body book_info

  Is

    Cursor books_cur(title_filter_in In books.title%TYPE)

      return books%ROWTYPE

    Is

      Select * from books where title like title_filter_in;

  End;

建议多把游标定义在包内,两个好处,隐藏游标的实现信息,而是最小化重编译,修改只需要修改包体部分,对于包头部分就不需要更改。

2)、打开显式游标:

  Open cursor_name[(argument ...]

如果试图打开一个已经打开过的游标会抛异常,通常可以通过cursor_name%Name来判断是否已经打开,在进行打开操作:

  if not company_cur%ISOPEN

   Then

    Open company_cur;

  End;

3)、从显式游标中提取数据:

  Fetch  cursor_name into record_or_variable_list;

  cursor_name游标名称,record_or_variable_list一个数据结构,用于把游标中的每条数据取出来暂时储存的变量。

  例子:

Declare

  Cursor company_cur Is Select ...;

  company_rec company%ROWTYPE;---定义一个游标变量,用于接收游标取出来的值

Begin

  Open company_cur;

  Fetch company_cur into company_rec;

End;

如果取出来的数据超过了最后一行,Fetch操作也不会抛异常,也不能通过游标变量来判断是否是最后一行, 可以通过%FOUND和%NOTFOUND属性来判断是否是最后一行数据。

4)、显式游标中的列别名:

   在Select语句中,有时候像求和(Sum)等函数的时候,不过不给这个列起个别名,在游标中这一列是没有办法使用的,也就是说,在游标的Select语句中,每一列都应该有一个列明。

  如:select sum(inv_ant) total_sales from ......

5)、关闭显式游标:

  Close cursor_name,

  注意:游标打开了,如果没有关闭,就会出现内存泄露的问题,一般在程序块中,在程序结束的时候,PL/SQL会检查打开的游标,并会隐式的关闭这些游标,但是,不是所有的游标都会关闭掉,并且会损耗很多性能,特别注意的是,如果一个游标是定义在包内,一旦在某个程序块中打开了这个游标,如果不关闭,这个游标会一直处于打开状态,当然试图关闭一个已经关闭的游标也会抛出异常。

6)、显式游标属性:

 

7)、游标参数:

   显式游标是可以带参数的,这样可以让游标使用起来比较灵活,不过游标的参数都是In类型的参数,不像过程那样有out和In out函数,因为游标根本就不需要有那样的输出参数,游标传入的参数,可以放在Where后作为查询条件,也可以放在Select后,作为单独的一列,在Open 游标的时候,给游标传入不同值的参数,就会获取到不同的数据,举个例子:

  Cursor emp_cur(emp_id_in number :=0)----参数可以有缺省值,如果打开时没传入参数,就用缺省值。也可以不用定义缺省值。

    Is

    select employee_id ,emp_name,emp_id_in from  employee where employ_id=emp_id_in;

     Open emp_cur(1001);---打开游标并传入参数

   Open emp_cur---打开游标,使用默认的参数。

posted on 2013-07-30 14:14  Kelly_HanShuai  阅读(149)  评论(0)    收藏  举报