Teilen über


Ausführen von Vorgängen mithilfe von RECORD-Typen in Oracle Database mithilfe des WCF-Dienstmodells

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-Datenbank zeigt RECORD-Typen als komplexe XML-Typen an. Im WCF-Dienstmodell werden RECORD-Typen in 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 in gespeicherten Prozeduren und Funktionen als TABLE%ROWTYPE-Parameter deklariert werden.

  • RECORD-Typen, die als TYP von RECORD-Parametern in PL/SQL-Paketen deklariert sind, z. B. TYPE rec_type1 IS RECORD(name varchar2(100), age number(3));

  • RECORD-Typen, die geschachtelte Datensätze enthalten.

  • RECORD-Typen, die als IN-, OUT- oder IN OUT-Parameter für Prozeduren oder Funktionen angezeigt werden.

  • RECORD-Typen, die RETURN-Werte 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-Datenbank mithilfe des WCF-Dienstmodells.

Informationen zu den in diesem Thema verwendeten Beispielen

In den Beispielen in diesem Thema wird das Paket "/SCOTT/ACCOUNT_PKG Oracle PL/SQL" verwendet. 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 vom 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 eindeutig die Funktion oder Prozedur des Parameters. 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 Aufrufen von Funktionen und Prozeduren in Oracle-Datenbank mithilfe des WCF-Dienstmodells.

Während der Namespace eines RECORD-Typparameters durch die Prozedur oder Funktion bestimmt wird, wird der Name der Klasse, die für den RECORD-Typparameter generiert wird, durch die Art und Weise bestimmt, wie 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 RECORD-Paketparameters [PACKAGE_NAME] [RECORD_TYPE_NAME] AUFZEICHNUNG ACCOUNT_PKGACCTINFO_REC_TYPERECORD

[PARAMETER_NAME] = der Name der Prozedur oder des Funktionsparameters; z. B. ACCT.

[PACKAGE_NAME] = der Name des Oracle-Pakets.

[RECORD_TYPE_NAME] = der in der RECORD TYPE-Deklaration angegebene Name; beispielsweise 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 verwendet zwei einfache RECORD-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 einem TABLE%ROWTYPE deklariert wurde, und einen Parameter, der mit einem TYP des RECORD-Pakettyps (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 ACCOUNT%ROWTYPE-Parameter 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 bestimmte RECORD-Typ ist der RETURN-Wert der funktion GET_ACCOUNTINFO (FUNCTION get_accountinfo(aid NUMBER) RETURN acctinfo_rec_type;). Der 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 wurde. Es enthält zwei geschachtelte einfache Datensatztypen, einen TABLE%ROW-Datensatz und einen Pakettyp des DATENSATZes. Diese beiden einfachen Datensätze werden im gleichen Namespace wie ihr übergeordneter Datensatz deklariert und folgen der erwarteten Namenskonvention.

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 instance des TYPS RECORD und übergeben sie an die entsprechende Methode auf dem WCF-Client. Wenn die Prozedur oder Funktion zurückgibt, können Sie Eigenschaften für alle OUT- oder IN OUT-Parameter oder FUNKTIONSRÜCKGABEwerte lesen, die als RECORD-Typen deklariert sind. Weitere Informationen zum Aufrufen von Prozeduren und Funktionen mithilfe des WCF-Dienstmodells finden Sie unter Aufrufen von Funktionen und Prozeduren in Oracle Database mithilfe des WCF-Dienstmodells.

Wichtig

Oracle RECORD-Typparameter (und Funktionsrückgibt) werden durch den Namespace ihrer Funktion oder Prozedur (und des Pakets) qualifiziert. Dies bedeutet, dass ein RECORD-Typ, der in zwei verschiedenen Prozeduren oder Funktionen verwendet wird, einen anderen Namespace für jede Prozedur oder Funktion aufweist. Sie müssen sicherstellen, dass Sie den RECORD-Typ ordnungsgemäß qualifizieren, wenn Sie ihn für eine bestimmte Prozedur oder Funktion verwenden. Beispielsweise wird ein Record-Pakettyp (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 sicher sein, dass Sie den richtigen Namespace für den Parameter verwenden, den Sie an jede jeweilige Funktion übergeben.

Im folgenden Beispiel wird die funktion CREATE_ACCOUNT 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 ausgelassen.

// 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();  
    }  
}  

Weitere Informationen

Entwickeln von Oracle Database-Anwendungen mithilfe des WCF-Dienstmodells