从存储过程返回数组参数

重要

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

  1. 返回单个结果集中的所有列:

    {call SimplePackage.Proc1( {resultset  3, o_id , ao_course, ao_dept  } ) }  
    
  2. 将每列作为单个结果集返回:

    {call SimplePackage.Proc1( {resultset 3, o_id},  {resultset 3, ao_course}, {resultset 3, ao_dept} ) }  
    

    这会返回三个结果集,每列一个结果集。

调用过程 PROC2

  1. 返回单个结果集中的所有列:

    {call SimplePackage.Proc2( 5 , {resultset  5, ao_Arg2, ao_Arg3} ) }  
    
  2. 将每列作为单个结果集返回:

    {call SimplePackage.Proc2( 5 , {resultset 5, ao_Arg2}, {resultset 5, ao_Arg3} ) }  
    

确保应用程序使用 SQLMoreResults API 提取所有结果集。 有关详细信息,请参阅 ODBC 程序员参考

注意

在 ODBC Driver for Oracle 版本 2.0 中,返回 PL/SQL 数组的 Oracle 函数不能用于返回结果集。