Exécuter des opérations à l’aide de CURSEURS REF dans Oracle Database à l’aide du modèle de service WCF
Un CURSEUR REF est un type de données Oracle PL/SQL qui représente un pointeur vers un jeu de résultats dans la base de données Oracle. L’adaptateur Microsoft BizTalk pour Oracle Database prend en charge les paramètres REF CURSOR dans les procédures, fonctions et packages. Les paramètres REF CURSOR peuvent être fortement typés ou faiblement typés en fonction de la façon dont ils sont déclarés dans la procédure ou la fonction. Pour obtenir une explication détaillée de la façon dont les paramètres REF CURSOR sont représentés par l’adaptateur Oracle Database, consultez Schémas de message pour REF CURSORS. Le tableau suivant récapitule la façon dont les paramètres REF CURSOR sont représentés dans le modèle de service WCF.
Direction des paramètres | CURSEUR REF fortement typé | CURSEUR REF faiblement typé |
---|---|---|
IN | string [PARAM_NAME] Chaîne qui contient un bloc PL/SQL. Le bloc PL/SQL doit retourner un CURSEUR REF ouvert en exécutant une instruction « OPEN FOR SELECT » ou en appelant une fonction ou une procédure. Un point d’interrogation ( ?) indique la position du CURSEUR REF qui retourne le paramètre. Par exemple, « BEGIN OPEN ? FOR SELECT * FROM MY_TABLE ; END » ou « BEGIN MY_PROC(PARM1, ?, PARM2) ; END ; ». |
Identique à fortement typé |
OUT | out [PROC_NS].[PARAM_NAME]RECORD[] [PARAM_NAME] Jeu d’enregistrements fortement typé. |
out [GENERIC_NS].GenRecordRow[] [PARAM_NAME] Jeu d’enregistrements génériques faiblement typé. |
IN OUT | LES paramètres IN OUT REF CURSOR sont divisés en un paramètre IN et un paramètre OUT. Le paramètre IN est ajouté avec « _IN » dans la signature de méthode pour le distinguer du paramètre OUT. Le paramètre OUT est représenté par un jeu d’enregistrements fortement typé.string [PARAM_NAME]_IN out [PROC_NS].[PARAM_NAME]RECORD[] [PARAM_NAME] |
LES paramètres IN OUT REF CURSOR sont divisés en un paramètre IN et un paramètre OUT. Le paramètre IN est ajouté avec « _IN » pour le distinguer du paramètre OUT. Le paramètre OUT est représenté par un jeu d’enregistrements faiblement typé.string [PARAM_NAME]_IN out [GENERIC_NS].GenRecordRow[] [PARAM_NAME] |
[PARAM_NAME] = nom du paramètre dans la définition de fonction ou de procédure sur la base de données Oracle ; par exemple, MYREFCURSOR.
[PROC_NS] = Espace de noms unique généré pour contenir les paramètres du package, de la procédure ou de la fonction ; par exemple, « microsoft.lobservices.oracledb._2007._03.SCOTT. Package.ACCOUNT_PKG. GET_ACTIVITY ».
[GENERIC_NS] = Espace de noms dans lequel le jeu d’enregistrements générique est défini, « microsoft.lobservices.oracledb._2007._03 ».
À propos des exemples utilisés dans cette rubrique
Les exemples de cette rubrique utilisent le package Oracle /SCOTT/Package/ACCOUNT_PKG. La procédure suivante est utilisée à partir de ACCOUNT_PKG :
PROCEDURE get_activity(inrecs IN SYS_REFCURSOR, status OUT NUMBER, inoutrecs IN OUT activity_ref_type, outrecs OUT SYS_REFCURSOR);
Un script pour générer ce package est fourni avec les exemples sdk. Pour plus d’informations sur les exemples de KIT de développement logiciel (SDK), consultez Exemples dans le KIT de développement logiciel (SDK).
Paramètres REF CURSOR dans le modèle de service WCF
Les exemples suivants montrent les classes et le client WCF générés pour la procédure /SCOTT/Package/ACCOUNT_PKG/GET_ACTIVITY. Cette procédure a des paramètres DE CURSEUR IN et OUT REF faiblement typés et un paramètre CURSEUR IN OUT REF fortement typé.
Voici la signature de la méthode générée dans le client WCF pour appeler GET_ACTIVITY.
public System.Nullable<decimal> GET_ACTIVITY(string INRECS, string INOUTRECS_IN, out microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACTIVITY.INOUTRECSRECORD[] INOUTRECS, out microsoft.lobservices.oracledb._2007._03.GenRecordRow[] OUTRECS);
Dans la méthode GET_ACTIVITY , le paramètre IN OUT INOUTRECS est divisé en deux paramètres :
INOUTRECS_IN est une chaîne qui représente un paramètre IN REF CURSOR.
INOUTRECS est un jeu d’enregistrements fortement typé qui représente un paramètre OUT REF CURSOR.
Le paramètre OUT faiblement typé, OUTRECS, est représenté sous la forme d’un jeu d’enregistrements générique. Le paramètre IN faiblement typé, INRECS, est représenté sous la forme d’une chaîne.
Strongly-Typed OUT REF CURSOR Parameters
Les paramètres DE CURSEUR REF OUT (ou IN OUT) fortement typés sont générés dans un espace de noms unique en fonction du SCHEMA, du PACKAGE et du nom de la procédure ou de la fonction dans laquelle ils sont utilisés. Pour la procédure /SCOTT/Package/ACCOUNT_PKG/GET_ACTIVITY, cet espace de noms est microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACTIVITY
. Le nom de la classe est formé en ajoutant le nom du paramètre avec « RECORD » et la classe est composée de propriétés qui représentent les champs Oracle. L’exemple suivant montre une partie de la classe qui représente les enregistrements fortement typés générés pour le paramètre INOUTRECS REF CURSOR.
namespace microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACTIVITY {
using System.Runtime.Serialization;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute()]
public partial class INOUTRECSRECORD : object, System.Runtime.Serialization.IExtensibleDataObject {
...
private System.Nullable<decimal> TIDField;
...
[System.Runtime.Serialization.DataMemberAttribute()]
public System.Nullable<decimal> TID {
get {
return this.TIDField;
}
set {
this.TIDField = value;
}
}
...
}
}
Weakly-Typed OUT REF CURSOR Parameters
Les paramètres REF CURSOR OUT (ou IN OUT) faiblement typés sont représentés par la classe d’enregistrement générique. Le jeu d’enregistrements générique est toujours généré dans le même espace de noms et avec le même nom de classe, quelle que soit la fonction ou la procédure. Le code suivant montre la classe d’enregistrement générique , microsoft.lobservices.oracledb._2007._03.GenRecordRow, qui représente les enregistrements du paramètre OUTRECS OUT SYS_REFCURSOR (faiblement typé).
namespace microsoft.lobservices.oracledb._2007._03 {
using System.Runtime.Serialization;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute()]
public partial class GenRecordRow : object, System.Runtime.Serialization.IExtensibleDataObject {
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
private microsoft.lobservices.oracledb._2007._03.GenRecordColumn[] GenRecordColumnField;
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public microsoft.lobservices.oracledb._2007._03.GenRecordColumn[] GenRecordColumn {
get {
return this.GenRecordColumnField;
}
set {
this.GenRecordColumnField = value;
}
}
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute()]
public partial class GenRecordColumn : object, System.Runtime.Serialization.IExtensibleDataObject {
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
private string ColumnNameField;
private string ColumnValueField;
private string ColumnTypeField;
public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
get {
return this.extensionDataField;
}
set {
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true, EmitDefaultValue=false)]
public string ColumnName {
get {
return this.ColumnNameField;
}
set {
this.ColumnNameField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
public string ColumnValue {
get {
return this.ColumnValueField;
}
set {
this.ColumnValueField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true, EmitDefaultValue=false, Order=2)]
public string ColumnType {
get {
return this.ColumnTypeField;
}
set {
this.ColumnTypeField = value;
}
}
}
}
Utilisation des paramètres REF CURSOR avec un client WCF
Pour appeler une procédure ou une fonction avec des paramètres REF CURSOR à l’aide d’un client WCF, procédez comme suit :
Transmettez une chaîne pour chaque paramètre IN ou IN OUT REF CURSOR qui contient le bloc PL/SQL pour ouvrir le CURSEUR REF. Ce bloc peut exécuter une instruction OPEN FOR SELECT ou appeler une fonction ou une procédure qui retourne un CURSEUR REF ouvert dans un paramètre OUT.
Lorsque la procédure ou la fonction retourne, utilisez les données dans les jeux d’enregistrements retournés pour tous les paramètres DE CURSEUR OUT ou IN OUT REF. Le jeu d’enregistrements sera un jeu d’enregistrements générique pour les paramètres REF CURSOR faiblement typés ou un jeu d’enregistrements fortement typé pour les paramètres REF CURSOR fortement typés.
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.
L’exemple suivant appelle la procédure GET_ACTIVITY. Il illustre les deux façons de spécifier un paramètre IN REF CURSOR :
Pour le paramètre IN REF CURSOR, une instruction OPEN FOR SELECT est spécifiée pour renvoyer l’activité des 100001 ACCOUNT.
Pour le paramètre IN OUT REF CURSOR, la procédure /SCOTT/Package/ACCOUNT_PKG/GET_ALL_ACTIVITY est appelée. Cette procédure ouvre un CURSEUR REF qui contient toute l’activité de la table ACCOUNTACTIVITY et le retourne en tant que paramètre OUT.
L’exemple montre également comment lire les données du jeu d’enregistrements retourné pour les paramètres REF CURSOR fortement typés et faiblement typés.
using System;
using System.Collections.Generic;
using System.Text;
// Add WCF, WCF LOB Adapter SDK, and Oracle Database adapter namepaces
using System.ServiceModel;
using Microsoft.ServiceModel.Channels;
using Microsoft.Adapters.OracleDB;
// Include this namespace for WCF LOB Adapter SDK and Oracle Database adapter exceptions
using Microsoft.ServiceModel.Channels.Common;
// namespaces for strongly-typed and weakly typed REF CURSOR records
using GET_ACTIVITYns = microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACTIVITY;
using GENERICns = microsoft.lobservices.oracledb._2007._03;
// In this sample, INRECS is opened by using an OPEN FOR statement, and
// INOUTRECS_IN is opened by calling the GET_ALL_ACTIVITY procedure on Oracle.
namespace OracleRefCursorsSM
{
class Program
{
static void Main(string[] args)
{
// Create the client
SCOTTPackageACCOUNT_PKGClient accountPkgClient =
new SCOTTPackageACCOUNT_PKGClient("OracleDBBinding_SCOTT.Package.ACCOUNT_PKG");
// Set credentials
accountPkgClient.ClientCredentials.UserName.UserName = "SCOTT";
accountPkgClient.ClientCredentials.UserName.Password = "TIGER";
try
{
GET_ACTIVITYns.INOUTRECSRECORD[] strongCursor;
GENERICns.GenRecordRow[] weakCursor;
Console.WriteLine("Opening client");
// Open the client
accountPkgClient.Open();
Console.WriteLine("Invoking ACCOUNT_PKG.GET_ACTIVITY");
// Get ACCOUNTACTIVITY records
// The IN REF CURSOR is set to all activity for account 100001
// The input part of the IN OUT ref cursor calls GET_ALL_ACTIVITY
// The weakly-typed OUT REF CURSOR parameter returns a list of activity for account 100001
// The strongly-typed IN OUT REF CURSOR parameter returns a list of all activity
string inRecsString = "BEGIN OPEN ? FOR SELECT * FROM ACCOUNTACTIVITY WHERE ACCOUNT=100001; END;";
string inoutRecsString = "BEGIN ACCOUNT_PKG.GET_ALL_ACTIVITY(?); END;";
accountPkgClient.GET_ACTIVITY(
inRecsString,
inoutRecsString,
out strongCursor,
out weakCursor);
// Display strong ref cursor (all activity)
Console.WriteLine("\nList of all activity returned (strong ref cursor)");
Console.WriteLine("Tx Id\tAccount\tAmount\tDate\t\t\tDescription");
for (int i = 0; i < strongCursor.Length; i++)
{
Console.WriteLine("{0}\t{1}\t{2:C}\t{3}\t{4}",strongCursor[i].TID,
strongCursor[i].ACCOUNT,
strongCursor[i].AMOUNT,
strongCursor[1].TRANSDATE,
strongCursor[i].DESCRIPTION);
}
// Display weak ref cursor (account 100001)
Console.WriteLine("\nList of activity for account 100001 returned (weak ref cursor)");
Console.WriteLine("Tx Id\tAmount\tDate\t\t\tDescription");
for (int i = 0; i < weakCursor.Length; i++)
{
Console.WriteLine("{0}\t{1:C}\t{2}\t{3}", weakCursor[i].GenRecordColumn[0].ColumnValue,
weakCursor[i].GenRecordColumn[2].ColumnValue,
weakCursor[i].GenRecordColumn[4].ColumnValue,
weakCursor[i].GenRecordColumn[3].ColumnValue);
}
Console.WriteLine("\nHit <RETURN> to finish");
Console.ReadLine();
}
catch (TargetSystemException tex)
{
Console.WriteLine("Exception occurred on the Oracle Database");
Console.WriteLine(tex.InnerException.Message);
}
catch (ConnectionException cex)
{
Console.WriteLine("Exception occurred connecting to the Oracle Database");
Console.WriteLine(cex.InnerException.Message);
}
catch (Exception ex)
{
Console.WriteLine("Exception is: " + ex.Message);
if (ex.InnerException != null)
{
Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);
}
throw ex;
}
finally
{
// Close the client
accountPkgClient.Close();
}
}
}
}
Voir aussi
Développer une application de base de données Oracle à l’aide du modèle de service WCF