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

Oracle Discussion :

Passage d'un tableau java à une procédure stockée


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 17
    Par défaut Passage d'un tableau java à une procédure stockée
    Bonjour,

    je suis confronté à un problème lors du passage d'un tableau d'entiers de mon code Java vers une procédure stockée.

    Dans ma base de données Oracle 9i, j'ai déclaré un type INTEGER_ARRAY :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE OR REPLACE
    TYPE INTEGER_ARRAY AS TABLE OF NUMBER(10);
    J'utilise ensuite ce type coté java pour transformer mon Tableau Java dans un type conpréhensible par Oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    long[] eleidsArray = new long[eleIds.size()];
    [...]
    ArrayDescriptor desc = ArrayDescriptor.createDescriptor("INTEGER_ARRAY", currentConnection);
    ARRAY oracleArray = new ARRAY(desc, currentConnection, eleidsArray)
    Ce code fonctionne trés bien avec avec des petits tableaux. Par contre dès que la taille dépasse 13500 éléments j'ai une exception (ce qui pose un problème vu que mes tableaux peuvent dépasser les 200000 éléments) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    java.sql.SQLException: Arguments non valides dans l'appel
    	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
    	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
    	at oracle.jdbc.dbaccess.DBItem.setArrayData(DBItem.java:262)
    	at oracle.jdbc.dbaccess.DBDataSetImpl.setADTBindItem(DBDataSetImpl.java:2738)
    	at oracle.jdbc.driver.OraclePreparedStatement.setARRAY(OraclePreparedStatement.java:1760)
    	at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:3083)
    	at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:3111)
    et voici la déclaration de ma proc stock :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      function getAttrData (
         docId integer,
    	 evo integer,
    	 idList integer_array
      )
       return XDB_ATTR_TYPE PIPELINED;
    Je vous remercie d'avance.

  2. #2
    Membre expérimenté Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Par défaut
    Bonjour,
    J'ai été confronté a ce probleme et je te préviens, trouver l'eereur peut être assez dur.

    En comparant ton code avec le mien, je ne vois pas de différence.
    Par contre je ne vois pas comment tu déclare ta procedure stocké Oracle coté JAVA, ni la définition des paramètres.

    Moi je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             String procedure = "{? = call getAttrData (?,?,?)}"
    			//Definition des paramètres
    			stmt.setARRAY(4, oracleArray );
    Sinon regarde le type de retour. Apparemment ce n'est pas un type commun. Peut être faut il le definir d'une facon speciale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			//Definition du resultat
    			stmt.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
    Le type sera bien sur différent de CURSOR.

  3. #3
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 17
    Par défaut
    je passe par JDO pour l'exécution de mes requêtes.
    Pour que JDO mette également en cache le résultat de mes procédures stockées, j'utilise la fonction PIPELINED d'oracle qui me retourne un resultset.
    Ca me permet dans ma proc stock de créer les resultset comme je le souhaite.

    voici par exemple un appel de procédure stockée PIPELINED :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table(cast(JDO_DATA.getElementData(?, ?, ?) as XDB_ELE_TYPE))
    Au final c'est comme l'exécution d'une requête normale donc voici l'appel via JDO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Object[] pParams = {
              new Long(aDocId),
              new Long(aDocEvolution), oracleArray};
    VersantQuery query = (VersantQuery) pm.newQuery("SQL", aQuery);
    query.setClass(aClass);
    query.declareParameters("BIGINT pDocId, BIGINT pEvo, ARRAY pIds");
    Collection col = (Collection) query.executeWithArray(pParams);
    Au niveau de JDO, je lui dis que je passe un paramètre de type ARRAY.

Discussions similaires

  1. Réponses: 11
    Dernier message: 22/05/2014, 11h45
  2. Réponses: 3
    Dernier message: 21/03/2014, 12h16
  3. Passage d'un tableau dans une procédure
    Par Matmal11 dans le forum Tcl/Tk
    Réponses: 2
    Dernier message: 12/10/2009, 17h04
  4. Passer en paramétre un tableau dans une procédure stockée
    Par killysui dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/04/2006, 11h47
  5. Réponses: 6
    Dernier message: 18/05/2005, 14h04

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