从存储过程返回数组参数
重要
Windows 的未来版本中将移除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 Oracle 提供的 ODBC 驱动程序。
在 Oracle 7.3 中,除了从 PL/SQL 程序访问 PL/SQL 记录类型之外,没有方法。 如果打包的过程或函数具有定义为 PL/SQL 记录类型的形参,则无法将该形参绑定为参数。 使用 Microsoft ODBC Driver for Oracle 中的 PL/SQL TABLE 类型从包含正确转义序列的过程调用数组参数。
若要调用 过程,请使用以下语法:
{call <package-name>.<proc-or-func>;
(..., {resultset <max-records-requested> ,<formal-array-param_1>,;
<formal-array-param_2>,...,<formal-array-param_n> }, ... ) }
注意
<max-records-requested> 参数必须大于或等于结果集中存在的行数。 否则,Oracle 将返回由驱动程序传递给用户的错误。
PL/SQL 记录不能用作数组参数。 每个数组参数只能表示数据库表的一列。
下面的示例定义一个包,其中包含返回不同结果集的两个过程,然后提供两种从包返回结果集的方法。
包定义:
CREATE OR REPLACE PACKAGE SimplePackage AS
TYPE t_id is TABLE of NUMBER(5)
INDEX BY BINARY_INTEGER;
TYPE t_Course is TABLE of VARCHAR2(10)
INDEX BY BINARY_INTEGER;
TYPE t_Dept is TABLE of VARCHAR2(5)
INDEX BY BINARY_INTEGER;
PROCEDURE proc1
(
o_id OUT t_id,
ao_course OUT t_Course,
ao_dept OUT t_Dept
);
TYPE t_pk1Type1 IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
TYPE t_pk1Type2 IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
PROCEDURE proc2
(
i_Arg1 IN NUMBER,
ao_Arg2 OUT t_pk1Type1,
ao_Arg3 OUT t_pk1Type2
);
END SimplePackage;
CREATE OR REPLACE PACKAGE BODY SimplePackage AS
PROCEDURE proc1 ( o_id OUT t_id,
ao_course OUT t_Course, ao_dept OUT t_Dept ) AS
BEGIN
o_id(1):= 200;
ao_course(1) := 'M101';
ao_dept(1) := 'EEE' ;
o_id(2) := 201;
ao_course(2) := 'PHY320';
ao_dept(2) := 'ECE' ;
END proc1;
PROCEDURE proc2
(
i_Arg1 IN NUMBER,
ao_Arg2 OUT t_pk1Type1,
ao_Arg3 OUT t_pk1Type2
)
AS
i NUMBER;
BEGIN
FOR i IN 1 .. i_Arg1 LOOP
ao_Arg2(i) := 'Row Number ' || to_char(i);
END LOOP;
FOR i IN 1 .. i_Arg1 LOOP
ao_Arg3(i) := i;
END LOOP;
END proc2;
END SimplePackage;
调用过程 PROC1
返回单个结果集中的所有列:
{call SimplePackage.Proc1( {resultset 3, o_id , ao_course, ao_dept } ) }
将每列作为单个结果集返回:
{call SimplePackage.Proc1( {resultset 3, o_id}, {resultset 3, ao_course}, {resultset 3, ao_dept} ) }
这会返回三个结果集,每列一个结果集。
调用过程 PROC2
返回单个结果集中的所有列:
{call SimplePackage.Proc2( 5 , {resultset 5, ao_Arg2, ao_Arg3} ) }
将每列作为单个结果集返回:
{call SimplePackage.Proc2( 5 , {resultset 5, ao_Arg2}, {resultset 5, ao_Arg3} ) }
确保应用程序使用 SQLMoreResults API 提取所有结果集。 有关详细信息,请参阅 ODBC 程序员参考。
注意
在 ODBC Driver for Oracle 版本 2.0 中,返回 PL/SQL 数组的 Oracle 函数不能用于返回结果集。