Condividi tramite


Eseguire operazioni con tipi RECORD nel database Oracle usando il modello di servizio WCF

I tipi ORACLE RECORD vengono usati per rappresentare informazioni gerarchiche nei parametri passati alle funzioni e alle procedure PL/SQL. L'adapter Microsoft BizTalk per Oracle Database espone i tipi RECORD come tipi XML complessi. Nel modello di servizio WCF i tipi RECORD vengono deserializzati in classi .NET fortemente tipizzate. I campi del record sono rappresentati come proprietà nella classe .

L'adapter Oracle Database supporta i tipi RECORD seguenti:

  • Tipi RECORD dichiarati come parametri TABLE%ROWTYPE in stored procedure e funzioni.

  • Tipi RECORD dichiarati come parametri TYPE of RECORD nei pacchetti PL/SQL, ad esempio TYPE rec_type1 IS RECORD(name varchar2(100), age number(3));

  • Tipi RECORD che contengono record annidati.

  • Tipi RECORD visualizzati come parametri IN, OUT o IN OUT per routine o funzioni.

  • Tipi RECORD che sono valori RETURN delle funzioni.

    In questo argomento viene illustrato il modo in cui i tipi RECORD sono rappresentati nel modello di servizio WCF. Per informazioni su come chiamare le routine e le funzioni Oracle, vedere Richiamare funzioni e routine in Oracle Database usando il modello di servizio WCF.

Informazioni sugli esempi usati in questo argomento

Gli esempi in questo argomento usano /SCOTT/ACCOUNT_PKG ORACLE PL/SQL PACKAGE. Gli elementi seguenti vengono usati da 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;  

Uno script per generare questo pacchetto viene fornito con gli esempi bizTalk Adapter Pack. Per altre informazioni, vedere lo script

Per altre informazioni sugli esempi, vedere Esempi di adapter.

Tipi DI RECORD nel modello di servizio WCF

I tipi ORACLE RECORD sono rappresentati come tipi XML complessi dall'adattatore Oracle Database. Nel modello di servizio WCF i tipi XML complessi sono rappresentati da una classe e le proprietà di questa classe rappresentano i campi del tipo ORACLE RECORD. La classe che rappresenta un parametro di tipo RECORD viene generata in uno spazio dei nomi qualificato da PACKAGE (se presente) e SCHEMA della funzione o della routine. Questo spazio dei nomi identifica in modo univoco la funzione o la routine del parametro. Ad esempio, i parametri di tipo RECORD per la routine di CREATE_ACCOUNT nel ACCOUNT_PKG ORACLE PACKAGE vengono creati nello spazio dei nomi seguente: microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT. Per altre informazioni sugli spazi dei nomi utilizzati nel modello di servizio WCF per rappresentare tipi complessi in procedure e funzioni, vedere Richiamare funzioni e routine nel database Oracle usando il modello di servizio WCF.

Mentre lo spazio dei nomi di un parametro di tipo RECORD è determinato dalla routine o dalla funzione, il nome della classe generata per il parametro di tipo RECORD viene determinato dal modo in cui viene dichiarato il tipo RECORD. Nella tabella seguente viene illustrato come viene generato il nome della classe in base ai due modi diversi per dichiarare il parametro di tipo ORACLE RECORD.

Tipo DI RECORD Oracle Nome Esempio
Table%ROWTYPE procedure o parametro di funzione [PARAMETER_NAME] REGISTRAZIONE ACCTRECORD
TIPO di parametro del pacchetto RECORD [PACKAGE_NAME] [RECORD_TYPE_NAME] REGISTRAZIONE ACCOUNT_PKGACCTINFO_REC_TYPERECORD

[PARAMETER_NAME] = nome della routine o del parametro della funzione; ad esempio ACCT.

[PACKAGE_NAME] = nome del pacchetto Oracle.

[RECORD_TYPE_NAME] = il nome specificato nella dichiarazione RECORD TYPE; ad esempio, ACCTINFO_REC_TYPE.

Il codice seguente mostra le firme del metodo del client WCF generato per due funzioni Oracle. La funzione /SCOTT/Package/ACCOUNT_PKG/CREATE_ACCOUNT accetta due semplici parametri DI tipo RECORD IN e la funzione /SCOTT/Package/ACCOUNT_PKG/GET_ACCOUNTINFO restituisce un parametro di tipo RECORD che contiene due tipi RECORD annidati. Le dichiarazioni di funzione Oracle sono incluse nella parte superiore del codice. I parametri di ogni funzione sono qualificati da uno spazio dei nomi univoco.

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

Il codice seguente mostra le classi generate per i parametri della funzione CREATE_ACCOUNT: FUNCTION create_account(acct IN ACCOUNT%ROWTYPE, addr IN address_rec_type) RETURN NUMBER;

Questa funzione ha un parametro dichiarato con TABLE%ROWTYPE e un parametro dichiarato con un tipo di pacchetto TYPE of 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 {…}  
  
}  

Rappresentazione di un tipo di record semplice

Nel codice seguente viene illustrato come un tipo RECORD semplice viene rappresentato nel modello di servizio WCF. Questo codice mostra la visualizzazione espansa della classe ACCOUNTRECORD che rappresenta il parametro ACCOUNT%ROWTYPE nella funzione CREATE_ACCOUNT. In questa classe i campi record (colonne di riga) vengono rappresentati come proprietà.

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

Rappresentazione di un tipo di record che contiene record annidati

Nel codice seguente viene illustrata la rappresentazione di un tipo RECORD che contiene record annidati. Questo particolare tipo RECORD è il valore RETURN della funzione GET_ACCOUNTINFO (FUNCTION get_accountinfo(aid NUMBER) RETURN acctinfo_rec_type;). Il ACCTINFO_REC_TYPE è un parametro del pacchetto dichiarato usando un costrutto TYPE of RECORD (TYPE acctinfo_rec_type IS RECORD (acct account%ROWTYPE, address address_rec_type);). Contiene due tipi di record semplici annidati, un record TABLE%ROW e un tipo di pacchetto di record. Questi due record semplici vengono dichiarati nello stesso spazio dei nomi del record padre e seguono la convenzione di denominazione prevista.

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 dei tipi RECORD nel codice

L'uso dei tipi RECORD nel codice è semplice. Per richiamare una routine o una funzione con un parametro di tipo RECORD, creare un'istanza del tipo o dei tipi RECORD e passarla al metodo appropriato nel client WCF. Quando la routine o la funzione viene restituita, è possibile leggere le proprietà su qualsiasi parametro OUT o IN OUT o valori RETURN della funzione dichiarati come tipi RECORD. Per altre informazioni su come richiamare routine e funzioni usando il modello di servizio WCF, vedere Richiamare funzioni e routine in Oracle Database usando il modello di servizio WCF.

Importante

I parametri di tipo RECORD Oracle (e la funzione restituisce) sono qualificati dallo spazio dei nomi della relativa funzione o routine (e pacchetto). Ciò significa che un tipo RECORD utilizzato in due diverse routine o funzioni avrà uno spazio dei nomi diverso per ogni routine o funzione. È necessario assicurarsi di qualificare correttamente il tipo RECORD quando viene usato per una routine o una funzione specifica. Ad esempio, un tipo RECORD del pacchetto (dichiarazione RECORD di TIPO) usato come parametro IN per due funzioni diverse verrà dichiarato due volte nel codice client WCF con ogni dichiarazione corrispondente allo spazio dei nomi univoco generato per ogni funzione. È necessario assicurarsi di usare lo spazio dei nomi corretto nel parametro passato a ogni rispettiva funzione.

Nell'esempio seguente la funzione CREATE_ACCOUNT viene chiamata con due parametri di record semplici. Viene quindi chiamata la funzione GET_ACCOUNTINFO. Questa funzione restituisce un tipo RECORD che contiene record annidati. I valori dei campi selezionati dall'oggetto RECORD restituito vengono scritti nella console. I passaggi per impostare le credenziali per il database Oracle e per aprire il client WCF vengono omessi da questo esempio.

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

Vedere anche

Sviluppare applicazioni Oracle Database usando il modello di servizio WCF