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

Persistance des données Java Discussion :

iBatis, appel d'une procedure stockee avec des arguments par defat.


Sujet :

Persistance des données Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut iBatis, appel d'une procedure stockee avec des arguments par defat.
    Bonjour,
    J'utilise iBatis depuis peu, et je me trouve devant un probleme que je n'arrive pas à résoudre, j'espere que certain d'entre vous pourrons m'aider.

    Voici mon problème :
    -J'ai un procédure stockée qui a comme arguments 2 Varchar2, le second prenant une valeur par defaut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE PACKAGE PKG_TEST IS 
    PROCEDURE P_TEST_PARAM_DEFAULT (PI_FIRST IN OUT varchar2, 
    PI_SECOND IN varchar2 default 'DeFaUlT');
    END PKG_TEST;
    CREATE OR REPLACE PACKAGE BODY PKG_TEST IS 
    PROCEDURE P_TEST_PARAM_DEFAULT (PI_FIRST IN OUT varchar2, PI_SECOND IN varchar2 default 'DeFaUlT')
    IS
    Begin
    PI_FIRST:=PI_FIRST||PI_SECOND;
    End P_TEST_PARAM_DEFAULT;
    END PKG_TEST;

    Je souhaiterais pouvoir appeller cette procédure stockée de maniere simple, que je passe 1 ou 2 parametre.

    Pour cela j'aimerai écrire dans la SQL map quelque chose chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	<parameterMap class="com.test.pkgtest.PTestParamDefault" id="PTestParamDefaultMap">
    		<parameter property="piFirst"		mode="INOUT"	jdbcType="VARCHAR"		javaType="java.lang.String"/>
    	<parameter property="piSecond"		mode="IN"	jdbcType="VARCHAR"		javaType="java.lang.String"/>
    	</parameterMap>
     
    	<procedure id="PTestParamDefault" parameterMap="PTestParamDefaultMap">  
    		<isPropertyAvailable property="piSecond">
    		call PKG_TEST.P_TEST_PARAM_DEFAULT(?,?)
    		</isPropertyAvailable>
    		call PKG_TEST.P_TEST_PARAM_DEFAULT(?)
    	</procedure>
    Mais ça ne fonctionne évident pas, ce serait trop facile !!


    Mon but serait qu'à partir du même appel depuis ma couche DAO (sqlMapClient.queryForObject(PkgTestService.P_TEST_PARAM_DEFAULT, params);), iBatis, dynamiquement, fasse le bon appel pour la proc Stock.

    Si quelqu'un à déjà eu affaire à un problème de ce type ou à une idée, je suis preneur !

    Cordialement

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Il ne faut pas encadrer le bloc "ispropertyavailable" dans un bloc "dynamic " par hasard?

    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <dynamic>        
      <isNotPropertyAvailable property="piSecond">
        call PKG_TEST.P_TEST_PARAM_DEFAULT(?)
      </isNotPropertyAvailable> 
     
      <isPropertyAvailable property="piSecond">
        call PKG_TEST.P_TEST_PARAM_DEFAULT(?,?)
      </isPropertyAvailable> 
    </dynamic>
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse, mais je crois bien que la balise <dynamic> est optionnelle.
    De toute façon, même apres l'avoir ajoutée j'ai l'erreur :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    com.ibatis.common.jdbc.exception.NestedSQLException:   
    --- The error occurred while applying a parameter map.  
    --- Check the Pkg_Test.PTestParamDefault-InlineParameterMap.  
    --- Check the statement (update procedure failed).  
    --- Cause: java.sql.SQLException: Paramètre IN ou OUT absent dans l'index :: 1
    	at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:185)
    	at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
    	at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:566)
    	at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:541)
    	at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)
    	at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:83)
    	at fr.ldcom.dao.ulysse.PkgTestServiceImpl.testParamDefault(PkgTestServiceImpl.java:55)
    	at fr.ldcom.ulysse.ParamDefaultTest.testGetP3Default(ParamDefaultTest.java:64)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:324)
    	at junit.framework.TestCase.runTest(TestCase.java:164)
    	at junit.framework.TestCase.runBare(TestCase.java:130)
    	at junit.framework.TestResult$1.protect(TestResult.java:106)
    	at junit.framework.TestResult.runProtected(TestResult.java:124)
    	at junit.framework.TestResult.run(TestResult.java:109)
    	at junit.framework.TestCase.run(TestCase.java:120)
    	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    Caused by: java.sql.SQLException: Paramètre IN ou OUT absent dans l'index :: 1
    	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
    	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)
    	at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:1536)
    	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2900)
    	at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:2996)
    	at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4120)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:324)
    	at com.ibatis.common.jdbc.logging.PreparedStatementLogProxy.invoke(PreparedStatementLogProxy.java:62)
    	at $Proxy1.execute(Unknown Source)
    	at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:279)
    	at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34)
    	at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
    	... 23 more
    Et j'ai la trace suivant dans la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [2011-07-05 15:30:18,566] DEBUG java.sql.Connection {conn-100000} Preparing Call: {call PKG_TEST.P_TEST_PARAM_DEFAULT(?,?)} 
    [2011-07-05 15:30:18,706] DEBUG java.sql.PreparedStatement {pstm-100001} Executing Statement: {call PKG_TEST.P_TEST_PARAM_DEFAULT(?,?)} 
    [2011-07-05 15:30:18,706] DEBUG java.sql.PreparedStatement {pstm-100001} Parameters: [] 
    [2011-07-05 15:30:18,706] DEBUG java.sql.PreparedStatement {pstm-100001} Types: []
    On voit donc que les parametres ne sont pas injectés lors de l'appel de la proc.

    Je me demande donc si les tag pour faire du SQL dynamique (<dynamic>, <isPropertyAvailable>, <isGreaterThan> ...)sont gérés lorsqu'ils sont inclus dans le tag <procedure>

    Est ce que quelqu'un les a déjà utilisé dans ce context là ??

Discussions similaires

  1. [hibernate] appel a une procedure stockee
    Par xavier_ dans le forum Hibernate
    Réponses: 1
    Dernier message: 13/11/2008, 10h26
  2. Appel d'une procédure stockée ayant des arguments de type TABLE despuis du code C#
    Par rabddoul dans le forum Interfaces de programmation
    Réponses: 3
    Dernier message: 23/10/2008, 10h47
  3. Réponses: 1
    Dernier message: 22/11/2006, 17h38
  4. [C#] Comment appeler une procédure stockée avec multiple SELECT ?
    Par Piolet dans le forum Accès aux données
    Réponses: 2
    Dernier message: 08/06/2006, 16h04
  5. [ASE][T-SQL] Appel d'une sous-proc avec des conditions
    Par metheorn dans le forum Sybase
    Réponses: 1
    Dernier message: 19/05/2006, 18h38

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