2. 动态游标(REF CURSOR)
首先 , 游标变量和游标是两个不同的概念 . 与游标相似 , 游标变量是指向多行查游标询的结果集的当前行 . 游标是静态的 , 游标变量是动态的 ,. 同时游标变量并不参与与特定的查询绑定 , 所以可以为任何兼容的查询打开游标变量 , 从而提高灵活性 . 而且 , 还可以将新的值赋予游标变量 , 将它作为参数传递给本地和存储过程 . 游标变量针对每个 PL/SQL 用户都是可用的 , 可以在客户端完全使用游标变量 .ORACLE 服务器同样包含 PL/SQL 引擎 , 可以将游标变量在应用和服务器之间进行传递 .
1. 游标变量 : 声明游标实际上是创建一个指针 , 指针具有数据类型 REF X.REF 是 REFERENCE ,X 是表示类对象 . 因此 , 游标变量具有数据类型 REF CURSOR.
注 : 游标总是指向相同的查询工作区 , 游标变量能够指向不同的工作区 , 因此游标和游标变量不能互操作 .
3. 定义 REF CURSOR 类型 , 创建游标变量有两个步骤 :
1) 定义 REF CURSOR 类型
语法格式 :
TYPE ref_type_name
IS
REF CURSOR [RETURN return_type]
说明 :
ref_type_name 是游标变量中使用的类型 ;return_type 必须是一个记录 (record) 或者数据库表中的一行 .(rowtype)
下面定义 一个 REF CURSOR 类型游标
DELARE
TYPE xs_cur
IS
REF CURSOR RETURN xs%ROWTYPE;
注意 :
REF CURSOR 类型既可以是强类型 , 也可以是弱类型 , 区别是强类型有返回类型 , 弱类型没有 . 如下所示
DECLARE
TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;-- 强类型
TYPE mycur IS REF CURSOR;-- 弱类型
2) 声明这种类型的游标变量 : 一旦定义了 REF CURSOR 类型就可以在 PL/SQL 块或子程序中声明这个游标变量 . 如 :
DECARE
TYPE xs_cur REF CURSOR RETURN xs%ROWTYPE;
xscur xs_cur;
当然 , 在 RETURN 子句中也可以定义自定义的 RECORD 类型 , 如 :
DECLARE
TYPE kc_cj IS RECORD
(
kch number (4),
kcm number(10),
cj number(4,2)
);
TYPE kc_cjcur IS REF CURSOR RETURN kc_cj;
此外 , 也可以声明游标变量作为函数和过程的参数 . 例如 :
DECLARE
TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;
PROCEDURE open_xs (xscur IN OUT xs_cur)IS
......................
3. 控制游标变量
使用游标变量时 , 要遵循以下步骤 :OPEN-FETCH-CLOSE
OPEN 语句与多行查询的游标变量相关联 , 它执行查询 , 标志结果集
语法格式 :
OPEN {cursor_variable|:host_cursor_variable }FOR
{
select_statement|dynamic_string[USING bind_argument[,......]]
}
如 :
IF NOT xscur%ISOPEN THEN
OPEN xscur FOR SELECT * FROM xs;
END IF ;
游标变量同样可以使用游标属性 :%FOUND,%ISOPEN,%ROWTYPE
在使用过程中 , 其他的 OPEN 语句可以为不同的查询打开相同的游标变量 . 因此 , 在重新打开之前 , 不要关闭游标变量 . 可以打开游标 , 并作为参数传递给存储过程 . 如 :
CREATE PACKAGE xs_data AS
...
TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;
RROCEDURE open_xs(xscur IN OUT xs_cur);
END xs_data;
CREATE PACKAGE BODY xs_data AS
...
PROCEDURE open_xs(xscur IN OUT xs_cur)
AS
BEGIN
OPEN xscur FOR SELECT * FROM xs;
END open_xs;
END xs_data;
当声明一个游标变量作为打开游标变量子程序的参数时 , 必须定义 IN OUT 模式 . 也就是说 , 子程序可以将一个打开的游标变量传递给调用者
首先 , 游标变量和游标是两个不同的概念 . 与游标相似 , 游标变量是指向多行查游标询的结果集的当前行 . 游标是静态的 , 游标变量是动态的 ,. 同时游标变量并不参与与特定的查询绑定 , 所以可以为任何兼容的查询打开游标变量 , 从而提高灵活性 . 而且 , 还可以将新的值赋予游标变量 , 将它作为参数传递给本地和存储过程 . 游标变量针对每个 PL/SQL 用户都是可用的 , 可以在客户端完全使用游标变量 .ORACLE 服务器同样包含 PL/SQL 引擎 , 可以将游标变量在应用和服务器之间进行传递 .
1. 游标变量 : 声明游标实际上是创建一个指针 , 指针具有数据类型 REF X.REF 是 REFERENCE ,X 是表示类对象 . 因此 , 游标变量具有数据类型 REF CURSOR.
注 : 游标总是指向相同的查询工作区 , 游标变量能够指向不同的工作区 , 因此游标和游标变量不能互操作 .
3. 定义 REF CURSOR 类型 , 创建游标变量有两个步骤 :
1) 定义 REF CURSOR 类型
语法格式 :
TYPE ref_type_name
IS
REF CURSOR [RETURN return_type]
说明 :
ref_type_name 是游标变量中使用的类型 ;return_type 必须是一个记录 (record) 或者数据库表中的一行 .(rowtype)
下面定义 一个 REF CURSOR 类型游标
DELARE
TYPE xs_cur
IS
REF CURSOR RETURN xs%ROWTYPE;
注意 :
REF CURSOR 类型既可以是强类型 , 也可以是弱类型 , 区别是强类型有返回类型 , 弱类型没有 . 如下所示
DECLARE
TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;-- 强类型
TYPE mycur IS REF CURSOR;-- 弱类型
2) 声明这种类型的游标变量 : 一旦定义了 REF CURSOR 类型就可以在 PL/SQL 块或子程序中声明这个游标变量 . 如 :
DECARE
TYPE xs_cur REF CURSOR RETURN xs%ROWTYPE;
xscur xs_cur;
当然 , 在 RETURN 子句中也可以定义自定义的 RECORD 类型 , 如 :
DECLARE
TYPE kc_cj IS RECORD
(
kch number (4),
kcm number(10),
cj number(4,2)
);
TYPE kc_cjcur IS REF CURSOR RETURN kc_cj;
此外 , 也可以声明游标变量作为函数和过程的参数 . 例如 :
DECLARE
TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;
PROCEDURE open_xs (xscur IN OUT xs_cur)IS
......................
3. 控制游标变量
使用游标变量时 , 要遵循以下步骤 :OPEN-FETCH-CLOSE
OPEN 语句与多行查询的游标变量相关联 , 它执行查询 , 标志结果集
语法格式 :
OPEN {cursor_variable|:host_cursor_variable }FOR
{
select_statement|dynamic_string[USING bind_argument[,......]]
}
如 :
IF NOT xscur%ISOPEN THEN
OPEN xscur FOR SELECT * FROM xs;
END IF ;
游标变量同样可以使用游标属性 :%FOUND,%ISOPEN,%ROWTYPE
在使用过程中 , 其他的 OPEN 语句可以为不同的查询打开相同的游标变量 . 因此 , 在重新打开之前 , 不要关闭游标变量 . 可以打开游标 , 并作为参数传递给存储过程 . 如 :
CREATE PACKAGE xs_data AS
...
TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;
RROCEDURE open_xs(xscur IN OUT xs_cur);
END xs_data;
CREATE PACKAGE BODY xs_data AS
...
PROCEDURE open_xs(xscur IN OUT xs_cur)
AS
BEGIN
OPEN xscur FOR SELECT * FROM xs;
END open_xs;
END xs_data;
当声明一个游标变量作为打开游标变量子程序的参数时 , 必须定义 IN OUT 模式 . 也就是说 , 子程序可以将一个打开的游标变量传递给调用者