Partager via


Exécuter des opérations à l’aide de types RECORD dans Oracle Database à l’aide du modèle de service WCF

Les types ORACLE RECORD sont utilisés pour représenter des informations hiérarchiques dans les paramètres passés aux fonctions et procédures PL/SQL. L’adaptateur Microsoft BizTalk pour Oracle Database expose les types RECORD en tant que types XML complexes. Dans le modèle de service WCF, les types RECORD sont désérialisés en classes .NET à typage fort. Les champs d’enregistrement sont représentés sous forme de propriétés sur la classe.

L’adaptateur Oracle Database prend en charge les types d’enregistrements suivants :

  • Types RECORD déclarés comme paramètres de type TABLE%ROWTYPE dans les procédures stockées et les fonctions.

  • Types RECORD déclarés en tant que types de paramètres RECORD dans les packages PL/SQL, par exemple, TYPE rec_type1 IS RECORD(name varchar2(100), age number(3));

  • Types d'enregistrements qui contiennent des enregistrements imbriqués.

  • Types RECORD qui apparaissent en tant que paramètres IN, OUT ou IN OUT pour les procédures ou les fonctions.

  • Types RECORD qui sont des valeurs de retour de fonctions.

    Cette rubrique montre comment les types RECORD sont représentés dans le modèle de service WCF. Pour plus d’informations sur l’appel de procédures et de fonctions Oracle, consultez Appeler des fonctions et des procédures dans Oracle Database à l’aide du modèle de service WCF.

À propos des exemples utilisés dans cette rubrique

Les exemples de cette rubrique utilisent /SCOTT/ACCOUNT_PKG Oracle PL/SQL PACKAGE. Les éléments suivants sont utilisés à partir de ACCOUNT_PKG.

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;  

Un script pour générer ce package est fourni avec les exemples BizTalk Adapter Pack. Pour plus d’informations, consultez le script

Pour plus d’informations sur les exemples, consultez Exemples d’adaptateurs.

Types d'enregistrement dans le modèle de service WCF

Les types Oracle RECORD sont représentés en tant que types XML complexes par l’adaptateur Oracle Database. Dans le modèle de service WCF, les types XML complexes sont représentés par une classe et les propriétés de cette classe représentent les champs du type Oracle RECORD. La classe qui représente un paramètre de type RECORD est générée dans un espace de noms qualifié par package (le cas échéant) et SCHEMA de la fonction ou de la procédure. Cet espace de noms identifie de manière unique la fonction ou la procédure du paramètre. Par exemple, les paramètres de type RECORD de la procédure de CREATE_ACCOUNT dans oracle PACKAGE ACCOUNT_PKG sont créés dans l’espace de noms suivant : microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT. Pour plus d’informations sur les espaces de noms utilisés dans le modèle de service WCF pour représenter des types complexes dans les procédures et les fonctions, consultez Invoke Functions and Procedures in Oracle Database à l’aide du modèle de service WCF.

Bien que l’espace de noms d’un paramètre de type RECORD soit déterminé par la procédure ou la fonction, le nom de la classe générée pour le paramètre de type RECORD est déterminé par la façon dont le type RECORD est déclaré. Le tableau suivant montre comment le nom de la classe est généré en fonction des deux façons différentes de déclarer le paramètre de type Oracle RECORD.

Type Oracle RECORD Nom Exemple :
Table%ROWTYPE paramètre de procédure ou de fonction [PARAMETER_NAME]ENREGISTRER ACCTRECORD
TYPE de paramètre de package RECORD [PACKAGE_NAME][RECORD_TYPE_NAME]ENREGISTREMENT ACCOUNT_PKGACCTINFO_REC_TYPERECORD

[PARAMETER_NAME] = nom du paramètre de procédure ou de fonction ; par exemple, ACCT.

[PACKAGE_NAME] = nom du package Oracle.

[RECORD_TYPE_NAME] = nom spécifié dans la déclaration RECORD TYPE ; par exemple, ACCTINFO_REC_TYPE.

Le code suivant montre les signatures de méthode du client WCF générées pour deux fonctions Oracle. La fonction /SCOTT/Package/ACCOUNT_PKG/CREATE_ACCOUNT accepte deux paramètres RECORD simples, et la fonction /SCOTT/Package/ACCOUNT_PKG/GET_ACCOUNTINFO retourne un paramètre de type RECORD qui contient deux types RECORD imbriqués. Les déclarations de fonction Oracle sont incluses en haut du code. Les paramètres de chaque fonction sont qualifiés par un espace de noms unique.

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

Le code suivant montre les classes générées pour les paramètres de la fonction CREATE_ACCOUNT : FUNCTION create_account(acct IN ACCOUNT%ROWTYPE, addr IN address_rec_type) RETURN NUMBER;

Cette fonction a un paramètre déclaré avec une TABLE%ROWTYPE et un autre paramètre déclaré avec un type de type de paquet RECORD (TYPE acctinfo_rec_type IS RECORD (acct account%ROWTYPE, address address_rec_type);).

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 {…}  
  
}  

Représentation d’un type d’enregistrement simple

Le code suivant montre comment un type RECORD simple est représenté dans le modèle de service WCF. Ce code montre la vue développée de la classe ACCOUNTRECORD qui représente le paramètre ACCOUNT%ROWTYPE dans la fonction CREATE_ACCOUNT. Dans cette classe, les champs d’enregistrement (colonnes de lignes) sont représentés en tant que propriétés.

[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;  
        }  
    }  
}  

Représentation d’un type d’enregistrement qui contient des enregistrements imbriqués

Le code suivant montre la représentation d’un type RECORD qui contient des enregistrements imbriqués. Ce type RECORD particulier est la valeur RETURN de la fonction GET_ACCOUNTINFO (FUNCTION get_accountinfo(aid NUMBER) RETURN acctinfo_rec_type;). L’ACCTINFO_REC_TYPE est un paramètre de package déclaré à l’aide d’une construction TYPE of RECORD (TYPE acctinfo_rec_type IS RECORD (acct account%ROWTYPE, address address_rec_type);). Il contient deux types d’enregistrements simples imbriqués, un enregistrement TABLE%ROW et un type de package d’enregistrement RECORD. Ces deux enregistrements simples sont déclarés dans le même espace de noms que leur enregistrement parent et suivent la convention d’affectation de noms attendue.

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;  
            }  
        }  
    }  

Utilisation de types RECORD dans votre code

L’utilisation de types RECORD dans votre code est simple. Pour appeler une procédure ou une fonction avec un paramètre de type RECORD, vous créez une instance du type ou des types RECORD et transmettez-la à la méthode appropriée sur le client WCF. Lorsque la procédure ou la fonction renvoie, vous pouvez lire les propriétés des paramètres OUT ou IN OUT, ou des valeurs de retour des fonctions déclarées en tant que types RECORD. Pour plus d’informations sur l’appel de procédures et de fonctions à l’aide du modèle de service WCF, consultez Appeler des fonctions et des procédures dans Oracle Database à l’aide du modèle de service WCF.

Important

Les paramètres du type Oracle RECORD (ainsi que les retours de fonction) sont qualifiés par l'espace de noms de leur fonction ou de leur procédure (et de leur package). Cela signifie qu’un type RECORD utilisé dans deux procédures ou fonctions différentes aura un espace de noms différent pour chaque procédure ou fonction. Vous devez être sûr de qualifier correctement le type RECORD lorsque vous l’utilisez pour une procédure ou une fonction spécifique. Par exemple, un type RECORD de package (déclaration de RECORD de TYPE) utilisé comme paramètre en entrée pour deux fonctions différentes est déclaré deux fois dans le code client WCF, chaque déclaration correspondant à l'espace de noms unique généré pour chaque fonction. Vous devez vous assurer d’utiliser l’espace de noms correct pour le paramètre que vous passez à chaque fonction.

Dans l’exemple suivant, la fonction CREATE_ACCOUNT est appelée avec deux paramètres d’enregistrement simples. Ensuite, la fonction GET_ACCOUNTINFO est appelée. Cette fonction retourne un type RECORD qui contient des enregistrements imbriqués. Les valeurs de champ sélectionnées de l’ENREGISTREMENT retourné sont écrites dans la console. Les étapes permettant de définir des informations d’identification pour la base de données Oracle et d’ouvrir le client WCF sont omises à partir de cet exemple.

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

Voir aussi

Développer des applications Oracle Database à l’aide du modèle de service WCF