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

Accès aux données Discussion :

iBatis/Oracle : problème exécution procédure stockée


Sujet :

Accès aux données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Points : 39
    Points
    39
    Par défaut iBatis/Oracle : problème exécution procédure stockée
    Bonjour,

    Je souhaite exécuter une procédure stockée Oracle avec iBatis. J'ai bien trouvé la doc correspondante et des exemples sur le Web, mais impossible de le faire fonctionner.
    Avec la variante 1 ci-dessous, j'ai le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.IndexOutOfRangeException: Un OracleParameter avec ParameterName '' n'est pas contenu dans ce OracleParameterCollection.
    Avec la variante 2 , j'ai le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.IndexOutOfRangeException: The parameter 'pe_orjeton' does not exist in the stored procedure 'ProcChargerDroitsUtilisateur'. Check your parameterMap.
    J'ai fait comme sur des exemples qui fonctionnent, mais impossible de faire marcher chez moi.

    Une idée SVP ?
    Merci.


    Signature de la procédure stockée (qui se trouve dans un package) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    PROCEDURE PROC_CHARGE_DROITS(
    	pe_orjeton IN vwjeton.orjeton%TYPE, -- number(16)
    	pe_cdtuserw_sel IN vwuser.cdtuserw%TYPE, -- varchar2(4)
    	pe_cduserw_sel IN vwuser.cduserw%TYPE, -- varchar2(12)
    	pe_cdtuserw IN vwuser.cdtuserw%TYPE, -- varchar2(4)
    	pe_cduserw IN vwuser.cduserw%TYPE, -- varchar2(12)
    	ps_code_erreur OUT VARCHAR2,
    	ps_libelle_erreur OUT VARCHAR2
    );
    Code C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Hashtable param = new Hashtable();
    param.Add("pe_orjeton", p_IdSession);
    param.Add("pe_cdtuserw_sel", p_TypeUser);
    param.Add("pe_cduserw_sel", p_CodeUser);
    param.Add("pe_cdtuserw", p_TypeUserConnecte);
    param.Add("pe_cduserw", p_CodeUserConnecte);
     
    param.Add("ps_code_erreur", null);
    param.Add("ps_libelle_erreur", null);
     
    Mapper.Instance().QueryForObject("ProcChargerDroitsUtilisateur", param);
    Fichier de mapping :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
      <statements>
        <procedure id="ProcChargerDroitsUtilisateur" parameterMap="ProcChargerDroitsUtilisateur-params">
          pack_charge_droits.proc_charge_droits
        </procedure>
      </statements>
     
      <parameterMaps>
     
        <parameterMap id="ProcChargerDroitsUtilisateur-params" class="HashTable">
     
    ===== Variante 1 =====
          <parameter property="pe_orjeton" direction="Input" dbType="Int64" />
          <parameter property="pe_cdtuserw_sel" direction="Input" dbType="VarChar2" />
          <parameter property="pe_cduserw_sel" direction="Input" dbType="VarChar2" />
          <parameter property="pe_cdtuserw" direction="Input" dbType="VarChar2" />
          <parameter property="pe_cduserw" direction="Input" dbType="VarChar2" />
          <parameter property="ps_code_erreur" direction="Output" dbType="VarChar2" />
          <parameter property="ps_libelle_erreur" direction="Output" dbType="VarChar2" />
     
    ===== Variante 2 =====
          <parameter property="pe_orjeton" column="pe_orjeton" />
          <parameter property="pe_cdtuserw_sel" column="pe_cdtuserw_sel" />
          <parameter property="pe_cduserw_sel" column="pe_cduserw_sel" />
          <parameter property="pe_cdtuserw" column="pe_cdtuserw" />
          <parameter property="pe_cduserw" column="pe_cduserw" />
          <parameter property="ps_code_erreur" direction="Output" />
          <parameter property="ps_libelle_erreur" direction="Output" />
     
        </parameterMap>
      </parameterMaps>

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Ton probleme vient d'ici:

    vwjeton.orjeton

    Il n'est pas reconnu.

    Dans le cas 1 : la valeur est vide
    Dans le cas 2: le parametre n'existe pas ou a une faute d'orthographe.

    Je sais tu vas me dire qu'il existe bien dans ta table vwjeton mais quand meme
    essaie de faire un test avec pour parametres tous les champs de la meme table et passe un entier.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Points : 39
    Points
    39
    Par défaut
    Bonjour tototata,

    Merci pour ta réponse, j'ai l'impression qu'il n'y a pas grand monde à utiliser iBatis par ici, à part nous deux !

    Je n'ai pas très bien compris ce que tu entendais par :
    essaie de faire un test avec pour parametres tous les champs de la meme table
    Est-ce que tu veux dire que iBatis ne comprend pas quel sont les types des paramètres de la procédure stockée ?
    est-ce qu'il faudrait qu'on modifie la proc.stockée pour avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROCEDURE PROC_CHARGE_DROITS(
    	pe_orjeton IN number(16),
    ...
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROCEDURE PROC_CHARGE_DROITS(
    	pe_orjeton IN vwjeton.orjeton%TYPE,
    ...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    En fait ce que je voulais dire c'etait de creer un nouveau champ de type entier dans ta table vwuser et de le passer en param de ta procedure.

    Sinon tu peux faire aussi ton test comme tu l'as spécifié.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Points : 39
    Points
    39
    Par défaut
    Ok, merci pour ta réponse. Je vais creuser cette piste.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Tiens moi au courant...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Après avoir laissé le problème de côté un bon moment, je viens de refaire des tests, en allant en débug dans le code source d'iBatis.Net... et j'ai réussi à faire marcher un exemple simple.
    Le voici :

    Package PL/SQL Oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    CREATE OR REPLACE package MWX_ibatistest is
     
      procedure proc_test(p_nb_in IN INTEGER, p_txt_inout IN OUT VARCHAR2, p_txt_out OUT VARCHAR2);
     
    end MWX_ibatistest;
    /
     
    CREATE OR REPLACE package body MWX_ibatistest is
     
    PROCEDURE proc_test (
      p_nb_in     IN     INTEGER,
      p_txt_inout IN OUT VARCHAR2,
      p_txt_out      OUT VARCHAR2
      )
      IS
      BEGIN
        p_txt_inout := p_txt_inout || p_nb_in || p_txt_inout;
        p_txt_out   := 'aaa' || p_nb_in || 'aaa';
      END;
     
    END MWX_ibatistest;
    /
    Mapping iBatis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    (...)
      <parameterMaps>
        <parameterMap id="paramsMwxProc">
          <parameter property="nombre1" column="P_NB_IN"     dbType="NUMBER"  type="long" direction="Input"/>
          <parameter property="texte1"  column="P_TXT_INOUT" dbType="VARCHAR" type="string" direction="InputOutput" size="50"/>
          <parameter property="texte2"  column="P_TXT_OUT"   dbType="VARCHAR" type="string" direction="Output" size="50"/>
        </parameterMap>
      </parameterMaps>
    (...)
      <statements>
        <procedure id="MWX_Proc_test" parameterMap="paramsMwxProc">
          MWX_ibatistest.proc_test
        </procedure>
      </statements>
    (...)
    Le code C# d'appel de la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    		public string AppelMwxProcTest(long p_nombre)
    		{
    			string l_Result;
    			try
    			{
    				Hashtable pMap = new Hashtable();
    				pMap.Add("nombre1", p_nombre);
    				pMap.Add("texte1", "ZZZ");
     
    				IBatisNet.DataMapper.Mapper.Instance().QueryForObject("MWX_Proc_test", pMap);
    				l_Result =
    					"Texte1 (IN/OUT) : " + pMap["texte1"] as string +
    					" - Texte2 (OUT) : " + pMap["texte2"] as string;
    			}
    			catch (Exception e)
    			{
    				throw new DaoException("Erreur lors de l'appel à MWX_Proc_test", e);
    			}
    			return l_Result;
    		}
    En espérant que ça serve à quelqu'un...

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

Discussions similaires

  1. [VB.NET]Performance exécution procédure stockée
    Par Franck2mars dans le forum Windows Forms
    Réponses: 3
    Dernier message: 29/05/2006, 16h11
  2. [SQL SERVER 2K]Droits d'exécution procédure stockée
    Par Franck2mars dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 16/05/2006, 15h01
  3. Réponses: 2
    Dernier message: 05/12/2005, 16h39
  4. Problème de procédure stockée
    Par Sorcier157 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/03/2005, 17h57
  5. [PowerBuilder/Oracle] Problème de procedure stockée
    Par delphine_lep dans le forum Powerbuilder
    Réponses: 1
    Dernier message: 02/09/2004, 14h08

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