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

PL/SQL Oracle Discussion :

Tableau en retour de fonction


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 36
    Par défaut Tableau en retour de fonction
    Je crée un autre post pour que l'information soit retrouvable si jamais quelqu'un la cherche

    Je voudrais savoir s'il est possible de récupérer un tableau de type VARRAY avec jdbc.

    Mes recherches sont un peu chaotiques sur le web.

    Ma procédure crée un tableau de type VARRAY OF VARCHAR2 d'une taille définie par une variable; je m'explique en pl/sql:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE FUNCTION maFonction RETURN VARRAY AS
    taille NUMBER;
    BEGIN
    taille:=ma_fonction_qui_détermine_la_taille;
    tab VARRAY OF VARCHAR2(taille); //Pas très propre de déclarer ici mais je n'ai pas le choix ?
    --Ajout des données dans tab
    RETURN tab;
    END;
    Ensuite en java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Array tab;
    Connection co  = OutilsJDBC.openConnection(url);
    CallableStatement cst = null;
    try {
    	cst = co.prepareCall("{?=call maFonction()}");
    	cst.registerOutParameter(1, java.sql.Types.ARRAY, );
    	cst.execute();
    	tab = cst.getArray(1);
    	cst.close();
    }
    catch (SQLException e) {
    	System.out.println(e);
    }
    J'obtient une erreur:
    ORA-03115: type de réseau ou représentation non pris en compte
    Quels sont vos avis ? C'est possible ?

    Merci

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Il y a un exemple sur le site d'oracle:
    http://www.oracle.com/technology/sam...ray/index.html
    mais il faut déclarer le type VARRAY en base (et pas dans la procédure) et comme VARRAY n'est pas très flexible essaie en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE OR REPLACE TYPE EMPARRAY is VARRAY(20) OF VARCHAR2(30)
    /
    par (mais pas sûr que ça marche)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE OR REPLACE TYPE EMPARRAY is TABLE OF VARCHAR2(30)
    /
    Concernant ton ancien post, tu as bien terminé la création de la fonction par un / (slash)?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 36
    Par défaut
    Bonsoir,

    Je suis désolé de ne pas avoir répondu plus tôt, j'étais vraiment très pris par mon projet et j'ai contourné le problème.

    Merci pour ta réponse, en effet j'ai oublié les VARRAY et j'ai crée mes propres types:

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE OR REPLACE TYPE MON_TYPE AS OBJECT (
      toto varchar2(10),
      tata NUMBER);
    Puis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE OR REPLACE TYPE MON_TAB IS TABLE OF MON_TYPE;

    Je récupère les résultats en java avec la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM table("ma_fonction");
    Mais du coup, ce n'est pas un tableau ! Et niveau flux de données je pense que l'on perd pas mal par rapport à utiliser un callable statement.

    La requête reste tout de même pré-compilée donc logiquement on gagne un peu de temps.

    Je regarderais si l'on peut récupérer des types définis sous oracle en java.

    Concernant ton ancien post, tu as bien terminé la création de la fonction par un / (slash)?
    Bien vu, je ne l'avais pas fait non
    A quoi sert-il au juste ? Car je n'avais pas vraiment l'impression que cela change le résultat de l'exécution.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Citation Envoyé par Nicolus Voir le message
    Je récupère les résultats en java avec la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM table("ma_fonction");
    Mais du coup, ce n'est pas un tableau ! Et niveau flux de données je pense que l'on perd pas mal par rapport à utiliser un callable statement.
    Je pense qu'utiliser une table fonction est très bien, en plus tu récupères un curseur, c'est le plus classique donc simple à utiliser.
    Citation Envoyé par Nicolus Voir le message
    A quoi sert-il au juste ? Car je n'avais pas vraiment l'impression que cela change le résultat de l'exécution.
    Running PL/SQL Blocks

    [EDIT]
    Je viens de tomber sur des liens qui devraient t'intéresser :
    return resultset as an array from function
    passing arrays into pl/sql stored procedures

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 36
    Par défaut
    Je n'aime pas faire des remontées de sujet, mais je n'aime pas ne pas remercier non plus

    Merci à toi !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2012, 16h31
  2. Fonction avec un tableau en retour
    Par viny dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 28/09/2006, 22h00
  3. [syntaxe] tableau et retour de fonction
    Par BainE dans le forum C++
    Réponses: 4
    Dernier message: 08/12/2005, 16h01
  4. passage de tableau 2D a une fonction
    Par watashinoitadakimasu dans le forum C
    Réponses: 2
    Dernier message: 11/09/2003, 02h33
  5. tableau de pointeyrs de fonctions
    Par icepower dans le forum C
    Réponses: 3
    Dernier message: 03/08/2002, 00h42

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