Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Oracle RECORD-Typen werden verwendet, um hierarchische Informationen in Parametern darzustellen, die an PL/SQL-Funktionen und -Prozeduren übergeben werden. Der Microsoft BizTalk Adapter für Oracle Database zeigt RECORD-Typen als komplexe XML-Typen an. Im WCF-Dienstmodell werden RECORD-Typen auf stark typisierte .NET-Klassen deserialisiert. Die Datensatzfelder werden als Eigenschaften für die Klasse dargestellt.
Der Oracle Database-Adapter unterstützt die folgenden Arten von RECORD-Typen:
RECORD-Typen, die als TABLE%ROWTYPE Parameter in gespeicherten Prozeduren und Funktionen deklariert werden.
RECORD-Typen, die z. B. als TYPE of RECORD-Parameter in PL/SQL-Paketen deklariert werden,
TYPE rec_type1 IS RECORD(name varchar2(100), age number(3));
RECORD-Typen, die geschachtelte Datensätze enthalten.
DATENSATZtypen, die als IN-, OUT- oder IN OUT-Parameter für Prozeduren oder Funktionen angezeigt werden.
Record-Typen, die Rückgabewerte von Funktionen sind.
In diesem Thema wird gezeigt, wie RECORD-Typen im WCF-Dienstmodell dargestellt werden. Informationen zum Aufrufen von Oracle-Prozeduren und -Funktionen finden Sie unter Aufrufen von Funktionen und Prozeduren in Oracle Database mithilfe des WCF-Dienstmodells.
Informationen zu den in diesem Thema verwendeten Beispielen
Die Beispiele in diesem Thema verwenden das /SCOTT/ACCOUNT_PKG Oracle PL/SQL PACKAGE. Die folgenden Elemente werden aus ACCOUNT_PKG verwendet.
TYPE address_rec_type IS RECORD (street customer.street%TYPE, city customer.city%TYPE, state customer.state%TYPE);
FUNCTION create_account(acct IN ACCOUNT%ROWTYPE, addr IN address_rec_type) RETURN NUMBER;
TYPE acctinfo_rec_type IS RECORD (acct account%ROWTYPE, address address_rec_type);
FUNCTION get_accountinfo(aid NUMBER) RETURN acctinfo_rec_type;
Ein Skript zum Generieren dieses Pakets wird mit den BizTalk Adapter Pack-Beispielen bereitgestellt. Weitere Informationen finden Sie im Skript
Weitere Informationen zu den Beispielen finden Sie unter Adapterbeispiele.
RECORD-Typen im WCF-Dienstmodell
Oracle RECORD-Typen werden durch den Oracle Database-Adapter als komplexe XML-Typen dargestellt. Im WCF-Dienstmodell werden komplexe XML-Typen durch eine Klasse dargestellt, und die Eigenschaften dieser Klasse stellen die Felder des Oracle RECORD-Typs dar. Die Klasse, die einen RECORD-Typparameter darstellt, wird in einem Namespace generiert, der von PACKAGE (falls vorhanden) und SCHEMA der Funktion oder Prozedur qualifiziert ist. Dieser Namespace identifiziert die Funktion oder Prozedur des Parameters eindeutig. Beispielsweise werden die RECORD-Typparameter für die CREATE_ACCOUNT Prozedur im Oracle PACKAGE ACCOUNT_PKG im folgenden Namespace erstellt: microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT
Weitere Informationen zu den Namespaces, die im WCF-Dienstmodell zum Darstellen komplexer Typen in Prozeduren und Funktionen verwendet werden, finden Sie unter Invoke Functions and Procedures in Oracle Database using the WCF Service Model.
Während der Namespace eines RECORD-Typparameters durch die Prozedur oder Funktion bestimmt wird, wird der Name der für den RECORD-Typparameter generierten Klasse durch die Art und Weise bestimmt, in der der RECORD-Typ deklariert wird. Die folgende Tabelle zeigt, wie der Name der Klasse basierend auf den beiden verschiedenen Methoden zum Deklarieren des Oracle RECORD-Typparameters generiert wird.
Oracle RECORD-Typ | Name | Beispiel |
---|---|---|
TABLE%ROWTYPE Prozedur- oder Funktionsparameter | [PARAMETER_NAME]AUFZEICHNUNG | ACCTRECORD |
TYP des DATENSATZ-Paketparameters | [PACKAGE_NAME][RECORD_TYPE_NAME]AUFZEICHNUNG | ACCOUNT_PKGACCTINFO_REC_TYPERECORD |
[PARAMETER_NAME] = der Name des Prozedur- oder Funktionsparameters; Beispiel: ACCT.
[PACKAGE_NAME] = der Name des Oracle-Pakets.
[RECORD_TYPE_NAME] = der in der RECORD TYPE-Deklaration angegebene Name; beispiel: ACCTINFO_REC_TYPE.
Der folgende Code zeigt die Methodensignaturen des WCF-Clients, der für zwei Oracle-Funktionen generiert wurde. Die Funktion /SCOTT/Package/ACCOUNT_PKG/CREATE_ACCOUNT akzeptiert zwei einfache RECORD-Typ-IN-Parameter, und die Funktion /SCOTT/Package/ACCOUNT_PKG/GET_ACCOUNTINFO gibt einen RECORD-Typparameter zurück, der zwei geschachtelte RECORD-Typen enthält. Die Oracle-Funktionsdeklarationen sind oben im Code enthalten. Die Parameter jeder Funktion werden durch einen eindeutigen Namespace qualifiziert.
FUNCTION create_account(acct IN ACCOUNT%ROWTYPE, addr IN address_rec_type) RETURN NUMBER;
FUNCTION get_accountinfo(aid NUMBER) RETURN acctinfo_rec_type;
public partial class SCOTTPackageACCOUNT_PKGClient : System.ServiceModel.ClientBase<SCOTTPackageACCOUNT_PKG>, SCOTTPackageACCOUNT_PKG {
...
public System.Nullable<decimal> CREATE_ACCOUNT(microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT.ACCTRECORD ACCT, microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT.ACCOUNT_PKGADDRESS_REC_TYPERECORD ADDR);
public microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNTINFO.ACCOUNT_PKGACCTINFO_REC_TYPERECORD GET_ACCOUNTINFO(System.Nullable<decimal> AID);
}
Der folgende Code zeigt die Klassen, die für die Parameter der CREATE_ACCOUNT-Funktion generiert wurden: FUNCTION create_account(acct IN ACCOUNT%ROWTYPE, addr IN address_rec_type) RETURN NUMBER;
Diese Funktion verfügt über einen Parameter, der mit einer TABLE-%ROWTYPE deklariert ist, und einen Parameter, der mit einem TYPE of RECORD-Pakettyp (TYPE acctinfo_rec_type IS RECORD (acct account%ROWTYPE, address address_rec_type);
) deklariert wurde.
namespace microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT {
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute()]
public partial class ACCTRECORD : object, System.Runtime.Serialization.IExtensibleDataObject {…}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute()]
public partial class ACCOUNT_PKGADDRESS_REC_TYPERECORD : object, System.Runtime.Serialization.IExtensibleDataObject {…}
}
Darstellung eines einfachen Datensatztyps
Der folgende Code zeigt, wie ein einfacher RECORD-Typ im WCF-Dienstmodell dargestellt wird. Dieser Code zeigt die erweiterte Ansicht der ACCOUNTRECORD-Klasse , die den PARAMETER ACCOUNT%ROWTYPE in der funktion CREATE_ACCOUNT darstellt. In dieser Klasse werden die Datensatzfelder (Zeilenspalten) als Eigenschaften dargestellt.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute()]
public partial class ACCTRECORD : object, System.Runtime.Serialization.IExtensibleDataObject {
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
private System.Nullable<decimal> ACCTIDField;
private string NAMEField;
private System.Nullable<decimal> BALANCEField;
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public System.Nullable<decimal> ACCTID {
get {
return this.ACCTIDField;
}
set {
this.ACCTIDField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string NAME {
get {
return this.NAMEField;
}
set {
this.NAMEField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute(Order=2)]
public System.Nullable<decimal> BALANCE {
get {
return this.BALANCEField;
}
set {
this.BALANCEField = value;
}
}
}
Darstellung eines Datensatztyps, der geschachtelte Datensätze enthält
Der folgende Code zeigt die Darstellung eines RECORD-Typs, der geschachtelte Datensätze enthält. Dieser spezielle RECORD-Typ ist der RÜCKGABEwert der funktion GET_ACCOUNTINFO (FUNCTION get_accountinfo(aid NUMBER) RETURN acctinfo_rec_type;
). Die ACCTINFO_REC_TYPE ist ein Paketparameter, der mit einem TYPE of RECORD-Konstrukt (TYPE acctinfo_rec_type IS RECORD (acct account%ROWTYPE, address address_rec_type);
) deklariert wird. Es enthält zwei geschachtelte einfache Datensatztypen: einen TABLE-%ROW-Datensatz und einen Pakettyp des Datensatzes. Diese beiden einfachen Datensätze werden im selben Namespace wie ihr übergeordneter Datensatz deklariert und folgen der erwarteten Benennungskonvention.
namespace microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNTINFO {
using System.Runtime.Serialization;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute()]
public partial class ACCOUNT_PKGACCTINFO_REC_TYPERECORD : object, System.Runtime.Serialization.IExtensibleDataObject {
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
private microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNTINFO.ACCTRECORD ACCTField;
private microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNTINFO.ACCOUNT_PKGADDRESS_REC_TYPERECORD ADDRESSField;
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
public microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNTINFO.ACCTRECORD ACCT {
get {
return this.ACCTField;
}
set {
this.ACCTField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
public microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNTINFO.ACCOUNT_PKGADDRESS_REC_TYPERECORD ADDRESS {
get {
return this.ADDRESSField;
}
set {
this.ADDRESSField = value;
}
}
}
Verwenden von RECORD-Typen in Ihrem Code
Die Verwendung von RECORD-Typen in Ihrem Code ist einfach. Um eine Prozedur oder Funktion mit einem RECORD-Typparameter aufzurufen, erstellen Sie eine Instanz des RECORD-Typs oder -Typen und übergeben sie an die entsprechende Methode auf dem WCF-Client. Wenn die Prozedur oder Funktion zurückkehrt, können Sie Eigenschaften für alle OUT- oder IN OUT-Parameter oder Rückgabewerte der Funktion lesen, die als RECORD-Typen deklariert wurden. Weitere Informationen zum Aufrufen von Prozeduren und Funktionen mithilfe des WCF-Dienstmodells finden Sie unter Invoke Functions and Procedures in Oracle Database using the WCF Service Model.
Von Bedeutung
Oracle RECORD-Typparameter (und Funktionsrückkehrer) werden durch den Namespace ihrer Funktion oder Prozedur (und paket) qualifiziert. Dies bedeutet, dass ein RECORD-Typ, der in zwei verschiedenen Prozeduren oder Funktionen verwendet wird, für jede Prozedur oder Funktion einen anderen Namespace aufweist. Sie müssen den RECORD-Typ unbedingt richtig qualifizieren, wenn Sie ihn für eine bestimmte Prozedur oder Funktion verwenden. Beispielsweise wird ein Paket RECORD-Typ (RECORD of TYPE-Deklaration), der als IN-Parameter für zwei verschiedene Funktionen verwendet wird, zweimal im WCF-Clientcode deklariert, wobei jede Deklaration dem eindeutigen Namespace entspricht, der für jede Funktion generiert wird. Sie müssen unbedingt den richtigen Namespace für den Parameter verwenden, den Sie an jede jeweilige Funktion übergeben.
Im folgenden Beispiel wird die CREATE_ACCOUNT-Funktion mit zwei einfachen Datensatzparametern aufgerufen. Als Nächstes wird die GET_ACCOUNTINFO-Funktion aufgerufen. Diese Funktion gibt einen RECORD-Typ zurück, der geschachtelte Datensätze enthält. Ausgewählte Feldwerte aus dem zurückgegebenen RECORD werden in die Konsole geschrieben. Schritte zum Festlegen von Anmeldeinformationen für die Oracle-Datenbank und zum Öffnen des WCF-Clients werden in diesem Beispiel weggelassen.
// Add WCF, WCF Adapter LOB SDK, and Oracle Database adapter namepaces
using System.ServiceModel;
using Microsoft.ServiceModel.Channels;
using Microsoft.Adapters.OracleDB;
// Include this namespace for WCF Adapter LOB SDK and Oracle Database adapter exceptions
using Microsoft.ServiceModel.Channels.Common;
…
// Create the client from configuration
using (SCOTTPackageACCOUNT_PKGClient accountPkgClient = new SCOTTPackageACCOUNT_PKGClient("OracleDBBinding_SCOTT.Package.ACCOUNT_PKG"))
{
...
decimal acctId;
// Create an account record
// Note: ACCTRECORD is defined in both namespaces so specify the definition
// that corresponds to the client.
microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT.ACCTRECORD acctRec =
new microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT.ACCTRECORD();
// Set any value for ACCTID -- new account ID is returned by CREATE_ACCOUNT
acctRec.ACCTID = 0;
acctRec.NAME = "Anton Kirilov";
acctRec.BALANCE = 9583;
// Create address record
microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT.ACCOUNT_PKGADDRESS_REC_TYPERECORD addrRec = new microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT.ACCOUNT_PKGADDRESS_REC_TYPERECORD();
addrRec.STREET = "234 Main St";
addrRec.CITY = "Boston";
addrRec.STATE = "MA";
// Create account
try
{
acctId = (decimal)accountPkgClient.CREATE_ACCOUNT(acctRec, addrRec);
}
catch (Exception ex)
{
// handle exception
...
}
...
// Account info record
microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNTINFO.ACCOUNT_PKGACCTINFO_REC_TYPERECORD acctInfo =
new microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNTINFO.ACCOUNT_PKGACCTINFO_REC_TYPERECORD();
// Get account info for the account just created
// acctInfo is returned as a nested record type
try
{
acctInfo = accountPkgClient.GET_ACCOUNTINFO(acctId);
}
catch (Exception ex)
{
// handle exception
...
}
// Write the account info to the console
Console.WriteLine("The account info is:");
Console.WriteLine("Name:\t\t\t{0}", acctInfo.ACCT.NAME);
Console.WriteLine("Street:\t\t\t{0}", acctInfo.ADDRESS.STREET);
Console.WriteLine("City:\t\t\t{0}", acctInfo.ADDRESS.CITY);
Console.WriteLine("State:\t\t\t{0}", acctInfo.ADDRESS.STATE);
Console.WriteLine("Account Id:\t\t{0}", acctInfo.ACCT.ACCTID);
Console.WriteLine("Account Balance:\t{0:C}", acctInfo.ACCT.BALANCE);
Console.WriteLine("\nHit <RETURN> to finish");
Console.ReadLine();
}
}
Siehe auch
Entwickeln von Oracle-Datenbankanwendungen mithilfe des WCF-Dienstmodells