IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces de programmation Oracle Discussion :

Appel d'une procédure stockée ayant des arguments de type TABLE despuis du code C#


Sujet :

Interfaces de programmation Oracle

  1. #1
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 102
    Points : 68
    Points
    68
    Par défaut Appel d'une procédure stockée ayant des arguments de type TABLE despuis du code C#
    Bonjour,

    Je cherche à appeler une procédure stockée oracle depuis du code C# qui prend en paramètre une liste de type Oracle.
    En gros j'ai defini un type de la manière suivante dans oracle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create or replace TYPE NomType AS OBJECT
    (
      prop1 varchar2(255),
      prop2 varchar2(255),
      prop3 varchar2(255),
      prop4 varchar2(255)
    )
    et une liste de type "NomType" de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create or replace TYPE "NomListType"
     IS TABLE OF "NomType"
    Après quoi je cherce à appeler une procstockée oracle qui prend en paramètre IN une variable de type NomListeType ?

    Comment puis je paramétre dans le code C# le passage de ce paramètre via la commande classique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sqlCmd = _refSchemaOwner + "NomProcStock";
    cmd = new OleDbCommand(sqlCmd, conn);
    cmd.CommandType = CommandType.StoredProcedure;
    param = new OleDbParameter("", OleDbType.VarChar);
    param.Direction = ParameterDirection.Input;
    param.Value = [Value];
    cmd.Parameters.Add(param);
    Quel type "OleDbType" puis je mettre pour ce paramètre de type liste?

    Merci d'avance

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    bonjour

    voici ce que j'ai déjà utilisé dans un de mes codes :

    Partie Oracle

    déclaration Type :
    TYPE myIdent IS TABLE OF XXXX.rrrr%TYPE index by pls_integer;
    TYPE myStatus IS TABLE OF XXXX.zzzz%TYPE index by pls_integer;


    la procédure
    PROCEDURE UpdateStatusFORALL(T_ident in myIdent, T_status in myStatus ) IS
    BEGIN

    forall i in T_ident.first..T_ident.last
    update XXXX
    set co_status = T_status(i)
    where id_event = T_ident(i);
    commit;
    END UpdateStatusFORALL;


    Partie C#

    Utiliser la dll
    Oracle.DataAccess.Client à télécharger sur le site Oracle

    using Oracle.DataAccess.Client; int[] T_ident = new int[X];
    int[] T_status = new int[X];

    OracleParameter Param1 = new OracleParameter();
    OracleParameter Param2 = new OracleParameter();

    // set parameter type for each parameter
    Param1.OracleDbType = OracleDbType.Int32;
    Param2.OracleDbType = OracleDbType.Int32;

    // set the collection type for each parameter
    Param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    Param2.CollectionType = OracleCollectionType.PLSQLAssociativeArray;

    Param1.Value = T_ident;
    Param2.Value = T_status;

    // set the size for each array
    Param1.Size = T_ident.Length;
    Param2.Size = T_status.Length;

    // add parameters to command object collection
    cmd.Parameters.Add(Param1);
    cmd.Parameters.Add(Param2);

    cmd.ExecuteNonQuery();


  3. #3
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 102
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    je te remercie de ton aide, mais cela ne correspond pas vraiment à ce que je recherche.
    Effectivement tu passes bien plusieurs collections à ta procédure stockées, mais elles sont de type Simple "OracleDbType.Int32".

    Ce que je voudrais faire c'est au lieu de passer deux paramètres de types oracle simple comme tu le fais dans ton exemple, passer Un seul paramètres qui correspondrait à une collection de type personnalisés que j'aurais créer dans oracle. De cette manière, cela m'éviterait d'avoir à passer autant de collections simple que j'ai de "propriété" dans mon type ORACLE.

    merci qd même ;-)

  4. #4
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 102
    Points : 68
    Points
    68
    Par défaut
    En réalité , ce que je voulais faire n'est pas faisable avec une version de client oracle inférieur à la version 11 qui fonctionne très bien avec un server oracle 9.2.

    Pour ce faire, il faut utiliser "ODP.Net 11g" téléchargeable sur le site d'oracle.
    A l'installation du client oracle 11g des exemples vont être installés sur votre disque dans un sous répertoire [UDT] du répertoire HOME de l'installation.

    Pour réussir à faire cela, il faut s'inspirer des deux projets suivant :
    Object2.csproj et VArray.csproj.

    En installant ce client 11g, vous aurez a votre disposition de nouvelle propriété pour l'enumération OracleDbType et notamment la possiblité de définir des collections avec OracleDbType.Array.

    De plus lors de la création d "OracleParameter", vous aurez accès à une propriété "UdtTypeName" qui vous permettra de préciser qu'un paramètre d'entrée/sortie" d'appel à un procédure est un User Data Type Oracle.

    Pour le reste , il faut créer un custom object oracle et mapper ses propriétés avec celle du User Data Type (montrer dans les exemples).


    Je vous laisse le soin de regarder les exemples qui sont très bien fait.

    Voila.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/10/2008, 17h49
  2. [c#] Appel d'une procédure stockée Record
    Par lapartdombre dans le forum Accès aux données
    Réponses: 4
    Dernier message: 02/08/2007, 17h20
  3. Réponses: 1
    Dernier message: 22/11/2006, 17h38
  4. Réponses: 2
    Dernier message: 10/12/2004, 15h43
  5. Appel d'une procédure stockée par un vbscript
    Par NicoNours dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/10/2004, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo