Freigeben über


Zurückgeben von Arrayparametern aus gespeicherten Prozeduren

Wichtig

Dieses Feature wird in einer zukünftigen Version von Windows entfernt. Nutzen Sie diese Funktionen bei Neuentwicklungen nicht mehr, und planen Sie die Änderung von Anwendungen, die diese Funktion zurzeit verwenden. Verwenden Sie stattdessen den von Oracle bereitgestellten ODBC-Treiber.

In Oracle 7.3 gibt es keine Möglichkeit, auf einen PL/SQL-Datensatztyp zuzugreifen, außer über ein PL/SQL-Programm. Wenn eine verpackte Prozedur oder Funktion über ein formales Argument verfügt, das als PL/SQL-Datensatztyp definiert ist, ist es nicht möglich, dieses formale Argument als Parameter zu binden. Verwenden Sie den PL/SQL TABLE-Typ im Microsoft ODBC-Treiber für Oracle, um Arrayparameter aus Prozeduren aufzurufen, die die richtigen Escapesequenzen enthalten.

Verwenden Sie die folgende Syntax, um die Prozedur aufzurufen:

{call  <package-name>.<proc-or-func>;  
(..., {resultset <max-records-requested> ,<formal-array-param_1>,;  
 <formal-array-param_2>,...,<formal-array-param_n> }, ... ) }  

Hinweis

Der <max-records-requested-Parameter> muss größer oder gleich der Anzahl der Zeilen sein, die im Resultset vorhanden sind. Andernfalls gibt Oracle einen Fehler zurück, der vom Treiber an den Benutzer übergeben wird.

PL/SQL-Datensätze können nicht als Arrayparameter verwendet werden. Jeder Arrayparameter kann nur eine Spalte einer Datenbanktabelle darstellen.

Im folgenden Beispiel wird ein Paket definiert, das zwei Prozeduren enthält, die unterschiedliche Resultsets zurückgeben. Anschließend werden zwei Möglichkeiten zum Zurückgeben von Resultsets aus dem Paket bereitgestellt.

Paketdefinition:

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;  

So rufen Sie die Prozedur PROC1 auf

  1. Gibt alle Spalten in einem einzelnen Resultset zurück:

    {call SimplePackage.Proc1( {resultset  3, o_id , ao_course, ao_dept  } ) }  
    
  2. Gibt jede Spalte als einzelnes Resultset zurück:

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

    Dadurch werden drei Resultsets zurückgegeben, eines für jede Spalte.

So rufen Sie die Prozedur PROC2 auf

  1. Gibt alle Spalten in einem einzelnen Resultset zurück:

    {call SimplePackage.Proc2( 5 , {resultset  5, ao_Arg2, ao_Arg3} ) }  
    
  2. Gibt jede Spalte als einzelnes Resultset zurück:

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

Stellen Sie sicher, dass Ihre Anwendungen alle Resultsets mithilfe der SQLMoreResults-API abrufen. Weitere Informationen finden Sie in der ODBC-Programmiererreferenz.

Hinweis

In VERSION 2.0 des ODBC-Treibers für Oracle können Oracle-Funktionen, die PL/SQL-Arrays zurückgeben, nicht verwendet werden, um Resultsets zurückzugeben.