Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los tipos RECORD de Oracle se usan para representar información jerárquica en parámetros pasados a funciones y procedimientos PL/SQL. El adaptador de Microsoft BizTalk para base de datos de Oracle expone 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 base de datos de Oracle admite los siguientes tipos de tipos RECORD:
Tipos de RECORD declarados como parámetros de TABLE%ROWTYPE en procedimientos almacenados y funciones.
Tipos RECORD que se declaran como parámetros de tipo 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 de RECORD que aparecen como parámetros IN, OUT o IN OUT en funciones o procedimientos.
Tipos de registro que son valores de retorno 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 procedimientos y funciones 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 /SCOTT/ACCOUNT_PKG Oracle PL/SQL PACKAGE. Los siguientes elementos se utilizan 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;
Se proporciona un script para generar este paquete con los ejemplos del paquete de adaptadores de BizTalk. Para más información, consulte el script.
Para obtener más información sobre los ejemplos, vea Ejemplos de adaptador.
Tipos de Registros en el modelo de servicio WCF
Los tipos RECORD de Oracle se representan como tipos XML complejos mediante el adaptador de base de datos de Oracle. 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 de CREATE_ACCOUNT de Oracle PACKAGE 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 |
---|---|---|
Table%ROWTYPE procedimiento o parámetro de función | [PARAMETER_NAME]REGISTRO | ACCTRECORD |
TIPO de parámetro de paquete RECORD | [PACKAGE_NAME][RECORD_TYPE_NAME]REGISTRO | 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 generado 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 un TABLE de%ROWTYPE y un parámetro declarado con un tipo de paquete 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 registro de tipo RECORD de paquete. 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áselo al método adecuado en el cliente WCF. Cuando el procedimiento o la función retornan, puede leer propiedades en algunos parámetros OUT o IN OUT o en valores de RETORNO 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 los valores de retorno de la función) están definidos por 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 respectiva.
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 record devuelto se escriben en la consola. Los pasos para establecer credenciales para 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();
}
}
Véase también
Desarrollo de aplicaciones de Base de datos de Oracle mediante el modelo de servicio WCF