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 14/05/2008, 18h30   #1
Invité de passage
 
Inscription : mai 2008
Messages : 9
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 9
Points : 4
Points : 4
Par défaut Fonction PL/SQL / Récursivité

Bonsoir à tous, alors voilà je vous explique mon souci.
Je voudrais créer une fonction récursive en PL/SQL qui me permettrais de récupérer l'identifiant parent, pour un enregistrement donné, l'enregistrement parent, et fils se trouvant dans la même table.

j'ai une table LISTEVALEUR qui se compose ainsi :

ID_LISTEVAL (id auto increment)
VAL (varchar, libellé de la valeur de liste)
ID_VAL_PARENT (identifiant de la valeur de liste parente ex: 52,64 qui fait référence au ID_LISTEVAL parent)

alors en fait ce que je voudrais faire, c'est créer une fonction qui boucle jusqu'a tomber sur la valeur parente de plus haut niveau.

on sait qu'une valeur est parente, quand sont ID_VAL_PARENT vaut '0'

l'algo de la fonction ressemblerait grosso à ça :


je récupére l'enregistrement de niveau n+1 à mon enregistrement 12

SELECT ID_VAL_PAR FROM LISTEVALEUR WHERE ID_LISTVAL='12'

BOUCLE

je refais un SELECT sur l'enregistrement n+1 pour trouver son propre ID_VAL_PAR

FIN BOUCLE quand l'enregistrement sur lequel je me trouve a un ID_VAL_PAR valant 0

les listes de valeurs on cette tête là :

---LISTE PARENTE de 1er niveau---
1;MOYEN DE TRANSPORT;0
x;HABITATION;0
y;PAYS;0


---SOUS LISTE de 2éme niveau---
2;TERRESTRE;1
3;AERIEN;1
4;AQUATIQUE;1

---SOUS LISTE de 3éme niveau---
5;VOITURE;2
6;TRAIN;2
7;VELO;2

---SOUS LISTE de 4éme niveau---
8;DIESEL;5
9;ESSENCE;5
10;GPL;5

---SOUS LISTE de 5éme niveau---
11;SP95;9
12;SP98;9


en fait, à partir de l'enregistrement 12 (SP98), j'aimerais retrouver l'enregistrement parent 1 (MOYEN DE TRANSPORT), ne sachant pas trop comment faire en PL SQL, je vous demande un peu d'aide, pour savoir quelle est la meilleure façon de le faire, fonction ? curseurs ?

merci pour votre aide
rayon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2008, 20h29   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Pas besoin de PL/SQL, CONNECT BY PRIOR est fait pour ça
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 11h53   #3
Invité de passage
 
Inscription : mai 2008
Messages : 9
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 9
Points : 4
Points : 4
Salut et merci pour ton aide
ta solution a bien marché !!!


pour ceux qui rencontreraient le même probléme, voilà comment j'ai fait :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 
FUNCTION FCT_GETPARENT(vIdListval IN Number)
RETURN LISTEVALEUR.VAL%TYPE IS
 
vParent LISTEVALEUR.VAL%TYPE;
 
BEGIN
 
SELECT val
INTO vParent
FROM LISTEVALEUR
WHERE ID_VAL_PARENT='0'
CONNECT BY PRIOR id_val_parent=id_listeval
START WITH id_listeval=vIdListval;
 
RETURN vParent;
END FCT_GETPARENT;
Citation:
Envoyé par orafrance Voir le message
Pas besoin de PL/SQL, CONNECT BY PRIOR est fait pour ça
rayon 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 16h47.


 
 
 
 
Partenaires

Hébergement Web