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
Gibt alle Spalten in einem einzelnen Resultset zurück:
{call SimplePackage.Proc1( {resultset 3, o_id , ao_course, ao_dept } ) }
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
Gibt alle Spalten in einem einzelnen Resultset zurück:
{call SimplePackage.Proc2( 5 , {resultset 5, ao_Arg2, ao_Arg3} ) }
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.