2009-09-09 5 views
2

J'ai une application Java accédant à une procédure stockée Oracle. Les arguments de la procédure stockée incluent un type de tableau. Je le fais comme suit ...java - transmission d'un tableau dans une procédure stockée oracle

con = this._getConnection(); 
Connection narrowdConn = (Connection)WSJdbcUtil.getNativeConnection((WSJdbcConnection)con); 

callable = con.prepareCall("{call MY_PKG.MY_PROCEDURE(?, ?)}"); 


ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("VARCHAR2_ARR", narrowdConn); 
ARRAY arrayArg1 = new ARRAY(arrayDescriptor, con, docNames); 
ARRAY arrayArg2 = new ARRAY(arrayDescriptor, con, docTypes); 

callable.setArray(1, arrayArg1); 
callable.setArray(2, arrayArg2); 

callable.execute(); 

Maintenant, je reçois cette exception ...

java.sql.SQLException: invalid name pattern: MY_PKG.VARCHAR2_ARR 

VARCHAR2_ARR est un type public défini à l'intérieur d'un package Oracle comme ce qui suit:

TYPE VARCHAR2_ARR EST TABLE DE VARCHAR2 (50);

Et utilisé comme tel dans mon proc stocké ...

PROCEDURE MY_PROCEDURE 
    (V_ARR_ARG1 IN VARCHAR2_ARR, 
    V_ARR_ARG2 IN VARCHAR2_ARR) 

Répondre

1

le type VARCHAR2_ARR est un type de PLSQL, vous ne serez pas en mesure d'interfacer directement à partir de Java. Je vous suggère de regarder dans this thread on AskTom concernant une question similaire.

Voici quelques suggestions:

  • créer un type SQL que vous pouvez lier de java
  • insertion dans une table temporaire de java et lire dans plsql

Dans les deux Dans certains cas, vous devrez soit modifier la procédure PLSQL, soit ajouter une nouvelle procédure de traduction.

+0

en fait le problème est que tout type créé dans un package n'est pas visible par java. Si je crée le type au niveau du schéma, alors cela fonctionne. – coder

+0

@Coder: Les types PLSQL ne sont pas accessibles directement à partir de Java. Vous devrez utiliser un vrai type SQL (type CREATE ...) et soit une procédure wrapper avec ce type SQL, soit modifier votre procédure pour accepter le nouveau type. –

+0

Si je comprends bien, si un type est déclaré à l'intérieur d'un paquet, il est appelé PLSQL type droit? Je suis confus sur la façon dont jdbc réussit à faire un appel à une procédure déclarée et définie dans un paquet si l'appel d'un type PLSQL échoue. Quelle est la différence entre les deux? –

0

Nous devons mettre accessToUnderlyingConnectionAllowed FALG vrai, tout en créant une source de données

Questions connexes