PL/SQL游标使用详解(二)

2014-11-24 14:09:59 · 作者: · 浏览: 3
游标

end;

2.6.3一次取出所有记录

declare

cursor cur_emp is

select e.ename, e.sal from emp e where e.deptno = 10; --声明游标

type it_ename is table of emp.ename%type index by binary_integer;

type it_sal is table of emp.sal%type index by binary_integer;

vit_ename it_ename;

vit_sal it_sal;

begin

open cur_emp; --打开游标

fetch cur_emp bulk collect

into vit_ename, vit_sal; --一次性取出所有记录

close cur_emp; --关闭游标

for i in vit_ename.first .. vit_ename.last loop

dbms_output.put_line(vit_ename(i) || '的工资是' || vit_sal(i));

end loop;

end;

3.游标变量

游标变量是指向或者引用底层游标的变量。显示游标已经为结果集的工作区指定了名字,而游标变量只是指向这个工作区的引用。显示游标和隐式游标都绑定到一个专门的查询语句,而游标变量可以是任何一个查询语句,也可以是查询语句的字符串变量或者字面量。因为游标变量的查询语句可以是多个不相同的查询,因此这种游标称为动态游标。显示游标和隐式游标称为静态游标。

3.1声明REF CURSOR类型

TYPE cursor_type_name IS REF CURSOR [RETURN return_type];

其中,cursor_type_name是游标类型的名字;return_type是该游标类型返回的数据类型。

REF CURSOR类型可是强类型(带有return)或者是弱类型(不带return)。以下两种声明都是有效的声明:

TYPE rc_emp is REF CURSOR RETURN emp%rowtype; --强类型

TYPE rc_emp is REF CURSOR;--弱类型

3.2声明游标变量

cursor_variable_name cursor_type_name;

其中,cursor_variable_name是游标变量的名字;cursor_type_name是之前的REF CURSOR声明的游标类型的名字。

3.3打开游标变量

OPEN cursor_variable_name FOR select_statement;

其中,cursor_variable_name是游标变量的名字; select_statement可以是一个直接的SQL语句,也可以一个SELECT语句的字符串或者字面。如果select_statement是字符串或者字面量,可以包含绑定变量的占位符,并可以使用USING子句标识相应的占位符值。

3.4提取数据

每次只提取一行数据:

FETCH cursor_name

INTO [(variable_name [, variable_name ]... | record_name )];

一次提取多行数据:

FETCH cursor_name

BULK COLLECT INTO [(collection_name [,collection_name...])];

3.5关闭显示游标

CLOSE cursor_name;

3.6游标变量属性

游标变量属性与显示游标属性一样,参见2.5

3.7游标变量例子

3.7.1一次只取一行记录

declare

type rc_emp is ref cursor; --声明ref游标类型

vrc_emp rc_emp; --声明游标变量

v_ename emp.ename%type;

v_sal emp.sal%type;

begin

open vrc_emp for

select e.ename, e.sal from emp e where e.deptno = 10; --打开游标变量,并赋值。

loop

fetch vrc_emp

into v_ename, v_sal; --提取记录

exit when vrc_emp%notfound;

dbms_output.put_line(v_ename || '的工资是' || v_sal);

end loop;

close vrc_emp; ---关闭游标变量

end;

3.7.2一次取出所有行记录

declare

type it_ename is table of emp.ename%type index by binary_integer;

type it_sal is table of emp.sal%type index by binary_integer;

type rc_emp is ref cursor; --声明ref游标类型\

vrc_emp rc_emp; --声明游标变量

vit_ename it_ename;

vit_sal it_sal;

v_ename emp.ename%type;

v_sal emp.sal%type;

begin

open vrc_emp for

select e.ename, e.sal from emp e where e.deptno = 10; --打开游标变量,并赋值。

fetch vrc_emp bulk collect

into vit_ename, vit_sal; --一次性取出所有记录

close vrc_emp; --关闭游标

for i in vit_ename.first .. vit_ename.last loop

dbms_output.put_line(vit_ename(i) || '的工资是' || vit_sal(i));

end loop;

end;

3.7.3查询语句是字符串变量

declare

type rc_emp is ref cursor; --声明ref游标类型

vrc_emp rc_emp; --声明游标变量

v_ename emp.ename%type;

v_sal emp.sal%type;

v_deptno emp.deptno%type := 10;

v_sql clob;

begin

v_sql := 'select e.ename, e.sal from emp e where e.deptno = :deptno';

open vrc_emp for v_sql

using v_deptno; --打开游标变量,并赋值。

loop

fetch vrc_emp

into v_ename, v_sal; --提取记录

exit when vrc_emp%notfound;

dbms_output.put_line(v_ename || '的工资是' || v_sal);

end loop;

close vrc_emp; ---关闭游标变量

end;

4.游标表达式

游标表达式返回一个嵌套游标,使用CUSOR操作符表示。可以使用游标表达式从一个或者多个表中提取庞大的复杂的记录集。

可以在下面的场合使用游标表达式:

显示游标声明REF CURSOR声明和REF CURSOR变量动态SQL查询

游标表达式语法:

CURSOR (subquery)

当父游标提取数据时,嵌套游标就会隐式地打开。嵌套游标在以下这些时刻关闭:

用户显示地关闭嵌套游标父游标再次执行父游标关闭父游标取消从父游标提取数据时抛出了异常。嵌