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 09/12/2010, 15h24   #1
Invité de passage
 
Inscription : janvier 2008
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 8
Points : 3
Points : 3
Par défaut Fonction recursive (hors gestion par intervalle)

Bonjour,

mon programme exploite une fonction récursive pour rechercher tous les enfants à partir d'un identifiant passé en paramètre.

Afin de gagner du temps d'accès réseau, je souhaiterai utiliser une fonction pl/sql.

Je système est déjà en production et il ne m'est donc pas possible d'utiliser les intervalles.
après avoir lu le cours sur les arborescences du site.
la solution par fonction récursive Pere/Fils n'est pas détaillé.
cependant y est décrit la fonction permettant récupérer tous les ascendants.

Est il possible de récupérer tous les enfants ?

Je sais très bien le faire par programmation, mais je n'ai pas grande compétence en PL/SQL pour le traduire.

Auriez-vous un exemple ?
nexuspolaris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 15h41   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
La représentation intervallaire sert surtout aux SGBD qui n'implémentent pas de récursivité, heureusement elle a toujours existé chez Oracle.

Quelle est votre version ?
Avez-vous quelques exemples à fournir ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 15h56   #3
Invité de passage
 
Inscription : janvier 2008
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 8
Points : 3
Points : 3
je travaille avec la 9i, et 11gR1,11gR2

Exemple j'ai une table nommé table

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
id  libelle    idpere
--  -----     -------
0   vehicule   *
1   auto       0
2   moto       0
3   citadine   1
4   4x4        1
5   berline    1
6   125        2
7   250        2
8   500        2
9   GS500      8
10  c1         3
en demandant les enfant de 3 (citadine)
je souhaite avoir 10
en demandant les enfant de 2 (moto)
je souhaite avoir 6,7,8,9
en demandant les enfant de 0 (vehicule)
j'ai 1,2,3,4,5,6,7,8,9,10
nexuspolaris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 16h12   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ça fonctionnera en 9i et 11g :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
WITH MaTable AS
(
SELECT  0 AS id, 'vehicule' AS libelle, NULL AS idpere FROM dual union ALL
SELECT  1      , 'auto'               ,    0           FROM dual union ALL
SELECT  2      , 'moto'               ,    0           FROM dual union ALL
SELECT  3      , 'citadine'           ,    1           FROM dual union ALL
SELECT  4      , '4x4'                ,    1           FROM dual union ALL
SELECT  5      , 'berline'            ,    1           FROM dual union ALL
SELECT  6      , '125'                ,    2           FROM dual union ALL
SELECT  7      , '250'                ,    2           FROM dual union ALL
SELECT  8      , '500'                ,    2           FROM dual union ALL
SELECT  9      , 'GS500'              ,    8           FROM dual union ALL
SELECT 10      , 'c1'                 ,    3           FROM dual
)
    SELECT id, libelle
      FROM MaTable
     WHERE level > 1
start WITH id = 3
connect BY idpere = prior id
  ORDER BY id ASC;
 
        ID LIBELLE 
---------- --------
        10 c1
Remplacez le 3 par la valeur de départ que vous désirez, voire changez la colonne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
    SELECT id, libelle
      FROM MaTable
     WHERE level > 1
start WITH libelle = 'moto'
connect BY idpere = prior id
  ORDER BY id ASC;
 
        ID LIBELLE 
---------- --------
         6 125     
         7 250     
         8 500     
         9 GS500
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 16h32   #5
Invité de passage
 
Inscription : janvier 2008
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 8
Points : 3
Points : 3
merci, pour cette réponse rapide,

cet exemple fonctionne bien si je le copie/colle tel quel dans sqlplus mais pas lorsque j'ai voulu l'adapter a mon cas.

j'ai voulu adapté cet exemple voici ce que j'ai ecrit :

Code :
1
2
3
4
SELECT cle_l 
FROM lieux 
WHERE connect_by_root cle_l <> cle_l start WITH cle_l = '0002' connect BY cle_l_pere = prior cle_l 
ORDER BY cle_l ASC;
voici l'erreur récupéré :
ERREUR ORA-00600 : code d'erreur interne,arguments : [qctcte1], [0], [], [], [], [], [], []

ma table comporte bien plus de champs que dans l'exemple, mais cela ne doit pas avoir d'incidence sur la requête puisque je sélectionne uniquement la cle ?

dois-je commencer aussi par with matable as (... ?
dans ce car quelle syntaxe utiliser pour une table existante ?


EDIT : Je n'avais pas vu le la condition LEVEL>1
Maintenant ca fonctionne a merveille
Merci.

[Resolu]
nexuspolaris 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 18h52.


 
 
 
 
Partenaires

Hébergement Web