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 15/12/2010, 17h43   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 6
Points : 1
Points : 1
Par défaut Requête SQL avec nested tables

Bonjour tout le monde!

J'aurais besoin de votre aide sur le sujet suivant:

J'ai une procédure avec quelques curseurs et je garde les résultats dans une variable de type TABLE OF x:

donc:
Code :
1
2
3
type x IS record(...) ;
type y IS TABLE of x;
ma_var y;
J'invoque ensuite une fonction en passant la variable du type que j'ai crée. my_func(ma_var)

Ma question est: comment puis-je accéder aux valeurs de ma_var dans my_func?

Je pourrais faire:
Code :
1
2
3
4
FOR i IN ma_var.FIRST .. ma_var.LAST
      LOOP
..
END LOOP;
mais j'ai besoin de faire un select distinct sur ma_var.

J'ai testé avec un curseur :
Code :
1
2
3
4
5
6
 TYPE item_rec IS RECORD(item_id NUMBER(20));
 
 TYPE rc_distinct_items IS REF CURSOR RETURN item_rec;
 
 c_distinct_items rc_distinct_items;
 l_distinct_items item_rec;
et ensuite:
Code :
open c_distinct_items FOR SELECT DISTINCT FROM (ma_var);

mais apparemment je ne pourrais pas utiliser ma_var dans un select.. :/

Quelqu'un a une solution ?
JLemon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 20h58   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Les types déclarés dans Pl/SQL (record pour exemple) ne sont pas connus pas le moteur SQL. Utilisez à la place un type objet déclaré dans la base en un type tableau de ces objets.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 10h21   #3
Invité de passage
 
Inscription : décembre 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 6
Points : 1
Points : 1
Bonjour mnitu.

Merci pour votre réponse. Est-ce la seule solution? Je voudrais éviter de créer le type de données dans la BD. :/
JLemon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 10h33   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par JLemon Voir le message
...Est-ce la seule solution? Je voudrais éviter de créer le type de données dans la BD. :/
Très probablement que non. Quelle est la version d'Oracle que vous utilisez ? Pourriez-vous donner un petit exemple (code complet de la procédure) de ce que vous essayez d'accomplir ? Ca permettra d'éviter les malentendus.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 10h56   #5
Invité de passage
 
Inscription : décembre 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 6
Points : 1
Points : 1
Re-bonjour

J'ai finalement réussi à faire ce que je voulais, en utilisant une fonction pipelined:

Code :
1
2
FUNCTION my_func_pipelined RETURN my_package.mon_type_tab
      PIPELINED
J'ai ensuite utilisé un curseur pour trier les résultats:

Code :
1
2
OPEN c_distinct_items FOR
         SELECT DISTINCT item_id FROM TABLE(my_func_pipelined);


Merci!
JLemon 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 04h55.


 
 
 
 
Partenaires

Hébergement Web