Ejecutar operaciones mediante tipos RECORD en oracle Database mediante el modelo de servicio WCF

Los tipos RECORD de Oracle se usan para representar información jerárquica en los parámetros pasados a los procedimientos y las funciones PL/SQL. El adaptador de Microsoft BizTalk para base de datos de Oracle muestra los tipos RECORD como tipos XML complejos. En el modelo de servicio WCF, los tipos RECORD se deserializan en clases .NET fuertemente tipadas. Los campos de registro se representan como propiedades en la clase .

El adaptador de Oracle Database admite los siguientes tipos de tipos RECORD:

  • Tipos RECORD declarados como parámetros TABLE%ROWTYPE en procedimientos almacenados y funciones.

  • Tipos RECORD que se declaran como TYPE de parámetros RECORD en paquetes PL/SQL, por ejemplo, TYPE rec_type1 IS RECORD(name varchar2(100), age number(3));

  • Tipos RECORD que contienen registros anidados.

  • Tipos RECORD que aparecen como parámetros IN, OUT o IN OUT en procedimientos o funciones.

  • Tipos RECORD que son valores RETURN de funciones.

    En este tema se muestra cómo se representan los tipos RECORD en el modelo de servicio WCF. Para obtener información sobre cómo llamar a funciones y procedimientos de Oracle, vea Invoke Functions and Procedures in Oracle Database using the WCF Service Model.

Acerca de los ejemplos usados en este tema

En los ejemplos de este tema se usa el paquete /SCOTT/ACCOUNT_PKG ORACLE PL/SQL. Los siguientes elementos se usan desde 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;  

Se proporciona un script para generar este paquete con los ejemplos del paquete de adaptadores de BizTalk. Para obtener más información, consulte el script.

Para obtener más información sobre los ejemplos, vea Ejemplos de adaptador.

Tipos record en el modelo de servicio WCF

Los tipos RECORD de Oracle se representan como tipos XML complejos mediante el adaptador de oracle Database. En el modelo de servicio WCF, los tipos XML complejos se representan mediante una clase y las propiedades de esta clase representan los campos del tipo RECORD de Oracle. La clase que representa un parámetro de tipo RECORD se genera en un espacio de nombres calificado por package (si existe) y SCHEMA de la función o procedimiento. Este espacio de nombres identifica de forma única la función o procedimiento del parámetro. Por ejemplo, los parámetros de tipo RECORD para el procedimiento CREATE_ACCOUNT del paquete de Oracle ACCOUNT_PKG se crean en el siguiente espacio de nombres: microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT. Para obtener más información sobre los espacios de nombres usados en el modelo de servicio WCF para representar tipos complejos en procedimientos y funciones, vea Invoke Functions and Procedures in Oracle Database using the WCF Service Model.

Aunque el espacio de nombres de un parámetro de tipo RECORD viene determinado por el procedimiento o la función, el nombre de la clase generada para el parámetro de tipo RECORD viene determinado por el modo en que se declara el tipo RECORD. En la tabla siguiente se muestra cómo se genera el nombre de la clase en función de las dos formas diferentes de declarar el parámetro de tipo RECORD de Oracle.

Tipo RECORD de Oracle Nombre Ejemplo
Parámetro de función o procedimiento TABLE%ROWTYPE [PARAMETER_NAME] GRABAR ACCTRECORD
TIPO de parámetro de paquete RECORD [PACKAGE_NAME] [RECORD_TYPE_NAME] GRABAR ACCOUNT_PKGACCTINFO_REC_TYPERECORD

[PARAMETER_NAME] = el nombre del procedimiento o parámetro de función; por ejemplo, ACCT.

[PACKAGE_NAME] = el nombre del paquete de Oracle.

[RECORD_TYPE_NAME] = el nombre especificado en la declaración RECORD TYPE; por ejemplo, ACCTINFO_REC_TYPE.

En el código siguiente se muestran las firmas de método del cliente WCF generadas para dos funciones de Oracle. La función /SCOTT/Package/ACCOUNT_PKG/CREATE_ACCOUNT toma dos parámetros RECORD de tipo IN simples y la función /SCOTT/Package/ACCOUNT_PKG/GET_ACCOUNTINFO devuelve un parámetro de tipo RECORD que contiene dos tipos RECORD anidados. Las declaraciones de función de Oracle se incluyen en la parte superior del código. Los parámetros de cada función se califican mediante un espacio de nombres único.

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

En el código siguiente se muestran las clases generadas para los parámetros de la función CREATE_ACCOUNT: FUNCTION create_account(acct IN ACCOUNT%ROWTYPE, addr IN address_rec_type) RETURN NUMBER;

Esta función tiene un parámetro declarado con table%ROWTYPE y un parámetro declarado con un tipo de paquete TYPE de 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 {…}  
  
}  

Representación de un tipo de registro simple

En el código siguiente se muestra cómo se representa un tipo RECORD simple en el modelo de servicio WCF. Este código muestra la vista expandida de la clase ACCOUNTRECORD que representa el parámetro ACCOUNT%ROWTYPE en la función CREATE_ACCOUNT. En esta clase, los campos de registro (columnas de fila) se representan como propiedades.

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

Representación de un tipo de registro que contiene registros anidados

El código siguiente muestra la representación de un tipo RECORD que contiene registros anidados. Este tipo RECORD determinado es el valor RETURN de la función GET_ACCOUNTINFO (FUNCTION get_accountinfo(aid NUMBER) RETURN acctinfo_rec_type;). El ACCTINFO_REC_TYPE es un parámetro de paquete declarado mediante una construcción TYPE of RECORD (TYPE acctinfo_rec_type IS RECORD (acct account%ROWTYPE, address address_rec_type);). Contiene dos tipos de registro simples anidados, un registro TABLE%ROW y un paquete TYPE de registro RECORD. Estos dos registros simples se declaran en el mismo espacio de nombres que su registro primario y siguen la convención de nomenclatura esperada.

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

Uso de tipos RECORD en el código

El uso de tipos RECORD en el código es sencillo. Para invocar un procedimiento o una función con un parámetro de tipo RECORD, cree una instancia del tipo o tipos RECORD y pásela al método adecuado en el cliente WCF. Cuando se devuelve el procedimiento o la función, puede leer propiedades en cualquier parámetro OUT o IN OUT o valores RETURN de función que se declaran como tipos RECORD. Para obtener más información sobre cómo invocar procedimientos y funciones mediante el modelo de servicio WCF, vea Invoke Functions and Procedures in Oracle Database using the WCF Service Model.

Importante

Los parámetros de tipo RECORD de Oracle (y las devoluciones de función) se califican mediante el espacio de nombres de su función o procedimiento (y paquete). Esto significa que un tipo RECORD que se usa en dos procedimientos o funciones diferentes tendrá un espacio de nombres diferente para cada procedimiento o función. Debe asegurarse de calificar correctamente el tipo RECORD cuando lo use para un procedimiento o una función específicos. Por ejemplo, un tipo RECORD de paquete (declaración RECORD de TIPO) que se usa como parámetro IN en dos funciones diferentes se declarará dos veces en el código de cliente WCF con cada declaración correspondiente al espacio de nombres único generado para cada función. Debe asegurarse de usar el espacio de nombres correcto en el parámetro que se pasa a cada función correspondiente.

En el ejemplo siguiente, se llama a la función CREATE_ACCOUNT con dos parámetros de registro simples. A continuación, se llama a la función GET_ACCOUNTINFO. Esta función devuelve un tipo RECORD que contiene registros anidados. Los valores de campo seleccionados del registro devuelto se escriben en la consola. Los pasos para establecer las credenciales de la base de datos de Oracle y para abrir el cliente WCF se omiten en este ejemplo.

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

Consulte también

Desarrollo de aplicaciones de Oracle Database mediante el modelo de servicio WCF