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)
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
@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. –
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? –