Nachrichtenschemas für REF CURSORS
Ein REF CURSOR ist ein Oracle PL/SQL-Datentyp, der einen Zeiger auf ein Resultset in der Oracle-Datenbank darstellt. REF CURSOR-Typen ermöglichen das Eingabe- und Ausgabestreaming von Daten und eignen sich ideal für die Übertragung großer Datenmengen in und aus einem PL/SQL-Codeblock. Der Microsoft BizTalk-Adapter für Oracle-Datenbank bietet Unterstützung für die Übergabe stark typisierter und schwach typisierter REF CURSOR-Parameter an PL/SQL-Prozeduren und -Funktionen als IN-, OUT- und IN OUT-Parameter.
In der Oracle-Datenbank kann ein REF CURSOR-Typ entweder stark oder schwach typisiert sein:
Ein stark typisierter REF CURSOR wird mit einer RETURN-Klausel wie in
TYPE StrongCurType IS REF CURSOR RETURN emp%ROWTYPE;
deklariert. Eine stark typisierte REF CURSOR-Variable kann nur ein Resultset darstellen, das Daten enthält, die dem Typ entsprechen, mit dem der REF CURSOR-Typ deklariert ist. Der Oracle Database-Adapter gibt ein stark typisiertes Resultset für einen stark typisierten REF CURSOR zurück.Ein schwach typisierter REF CURSOR wird ohne eine RETURN-Klausel wie in
TYPE WeakCurType IS REF CURSOR;
deklariert. Oracle bietet auch einen speziellen REF CURSOR-Typ namens SYS_REFCURSOR, der zum Deklarieren schwach typisierter REF CURSOR-Variablen verwendet werden kann. Schwach typisierte REF CURSOR-Variablen können ein Resultset darstellen, das jede Art von Zeilendaten enthält. Der Oracle Database-Adapter gibt einen schwach typisierten Resultset von generischen Datensätzen für einen schwach typisierten REF CURSOR zurück.
IN REF CURSOR-Parameter
Es gibt keine ODP.NET-API zum Erstellen eines REF CURSOR auf dem Oracle-Server, sodass der Oracle Database-Adapter nicht die Funktion für ein Clientprogramm zum Erstellen und Verwalten von REF CURSOR-Variablen bereitstellen kann.
Der Oracle Database-Adapter ermöglicht es einem Client jedoch, IN REF CURSOR-Parameter an Funktionen oder gespeicherte Prozeduren zu übergeben, indem er einen PL/SQL-Codeblock angibt, der einen REF CURSOR zurückgibt. Der Adapter verwendet diesen Code, um eine REF CURSOR-Variable auf dem Oracle-Server zu erstellen und zu öffnen. Anschließend wird die Funktion oder gespeicherte Prozedur mithilfe dieser Variablen als IN-Parameter aufgerufen.
Der Oracle Database-Adapter stellt IN REF CURSOR-Parameter als Zeichenfolgen dar, die den PL/SQL-Codeblock enthalten. Innerhalb dieses Blocks wird die Position des REF CURSOR mit einem Fragezeichen (?) angegeben. Der PL/SQL-Codeblock kann eine OPEN-FOR-Anweisung enthalten, die eine SQL-Abfrage enthält. Oder sie kann einen Funktions- oder Prozeduraufruf enthalten, in dem ein geöffneter REF CURSOR in einem OUT-Parameter zurückgegeben wird.
Im Folgenden wird gezeigt, wie Sie einen IN REF CURSOR angeben, indem Sie eine gespeicherte Prozedur oder Funktion aufrufen, um den REF CURSOR zu öffnen.
<[IN_REF_CURSOR_PARAM_NAME]>begin [SP_NAME]([SP_PARAMS...], ?, [SP_PARAMS...]); end;</[IN_REF_CURSOR_PARAM_NAME]>
Example:
<EMP_RC>begin GETEMP(1, ?); end; </EMP_RC>
Im Folgenden wird gezeigt, wie Sie einen IN REF CURSOR mithilfe einer SELECT-Abfrage angeben, um den REF CURSOR zu öffnen.
<IN_REF_CURSOR_PARAM_NAME>begin open ? for select [FIELD_NAMES] from [TABLE_NAME]; end;</IN_REF_CURSOR_PARAM_NAME>
Example:
<EMP_RC>begin open ? for select * from EMP; end;</EMP_RC>
OUT REF CURSOR-Parameter
OUT REF CURSOR-Parameter werden entweder als stark typisierte oder schwach typisierte Resultsets zurückgegeben. Der Typ des zurückgegebenen Resultsets hängt davon ab, ob der REF CURSOR-Parameter in der gespeicherten Prozedur oder Funktionsdefinition auf dem Oracle-Server als stark typisierte oder schwach typisierte REF CURSOR deklariert wird. Für stark typisierte REF CURSOR-Parameter wird ein stark typisiertes Resultset zurückgegeben, und für schwach typisierte REF CURSOR-Parameter (z. B. mit einem SYS_REFCURSOR Typ deklarierte Parameter) wird ein schwach typisiertes Resultset zurückgegeben.
Im Folgenden wird der XML-Code für einen stark typisierten OUT REF CURSOR-Parameter veranschaulicht.
<[PARAM_NAME]>
<[PARAM_NAME]RECORD>
<[COL1_NAME]>value1</[COL1_NAME]>
<[COL2_NAME]>value2</[COL2_NAME]>
...
</[PARAM_NAME]RECORD>
</[PARAM_NAME]>
[PARAM_NAME] = OUT REF CURSOR parameter name; for example, EMP_REFCURSOR
[COL_NAME] = Name of a column in the REF CURSOR type; for example, Name.
Im Folgenden wird der XML-Code für einen schwach typisierten OUT REF CURSOR-Parameter veranschaulicht.
<[PARAM_NAME]>
<GenRecordRow xmlns="oracledb">
<GenRecordColumn>
<ColumnName>COL_NAME</ColumnName>
<ColumnValue>COL_VALUE</ColumnValue>
<ColumnType>COL_TYPE</ColumnType>
</GenRecordColumn>
…
</GenRecordRow>
…
</[PARAM_NAME]>
[COL_NAME] = Name of column; for example, Name
[COL_VALUE] = Column value; for example, Scott
[COL_TYPE] = Column data type; for example, System.String
IN OUT REF CURSOR-Parameter
Da der Oracle Database-Adapter IN REF CURSOR-Parameter als Zeichenfolgen und OUT REF CURSOR-Parameter als komplexe Typen modelliert, kann er keinen einzelnen Typ für einen IN OUT REF CURSOR-Parameter unterstützen. Aus diesem Grund werden IN OUT REF CURSOR-Parameter als zwei verschiedene Parameter behandelt: ein IN-Parameter in der Anforderungsnachricht und ein OUT-Parameter in der Antwortnachricht.
Um einen Namenskonflikt bei der Dienstmodellprogrammierung zu vermeiden, fügt der Oracle Database-Adapter die Zeichenfolge "_IN" an den IN-Parameter in der Anforderungsnachricht an, sodass für einen bestimmten Parameter namens [PARAM_NAME] zwei Parameter erstellt werden:
[PARAM_NAME]_IN ist ein IN REF CURSOR-Parameter in der Nachricht der gespeicherten Prozedur oder Funktionsanforderung. Sie enthält eine PL/SQL-Anweisung (entweder eine Select-Abfrage oder eine gespeicherte Prozedur oder einen Funktionsaufruf), die einen REF CURSOR zurückgibt.
[PARAM_NAME] ist ein OUT REF CURSOR-Parameter in der Antwortnachricht für die gespeicherte Prozedur oder Funktion. Er enthält den OUT REF CURSOR als stark typisiertes oder schwach typisiertes Resultset.
Wichtig
Der Adapter kann keine Prozedur oder Funktion unterstützen, die einen IN-Parameter namens [PARAM_NAME]_IN und einen IN OUT REF CURSOR-Parameter namens [PARAM_NAME] enthält. Dies liegt daran, dass der Adapter erwartet, dass ein Parameter namens [PARAM_NAME]_IN die Eingabe für den REF CURSOR-Parameter darstellt, und Sie können nicht beide Parameter in der Anforderungsnachricht angeben.
Weitere Informationen
Nachrichten und Nachrichtenschemas für BizTalk Adapter für Oracle Database