Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/12/2010, 11h25   #1
Nouveau Membre du Club
 
Inscription : décembre 2010
Messages : 36
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 36
Points : 28
Points : 28
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 :
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 :
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:
Citation:
ORA-03115: type de réseau ou représentation non pris en compte
Quels sont vos avis ? C'est possible ?

Merci
Nicolus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2010, 16h03   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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 :
1
2
CREATE OR REPLACE TYPE EMPARRAY IS VARRAY(20) OF VARCHAR2(30)
/
par (mais pas sûr que ça marche)
Code :
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)?
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 21h11   #3
Nouveau Membre du Club
 
Inscription : décembre 2010
Messages : 36
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 36
Points : 28
Points : 28
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 :
1
2
3
CREATE OR REPLACE TYPE MON_TYPE AS OBJECT (
  toto varchar2(10),
  tata NUMBER);
Puis:

Code :
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 :
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.

Citation:
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.
Nicolus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 23h32   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Envoyé par Nicolus Voir le message
Je récupère les résultats en java avec la requête:
Code :
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
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 17h16   #5
Nouveau Membre du Club
 
Inscription : décembre 2010
Messages : 36
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 36
Points : 28
Points : 28
Je n'aime pas faire des remontées de sujet, mais je n'aime pas ne pas remercier non plus

Merci à toi !
Nicolus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h30.


 
 
 
 
Partenaires

Hébergement Web