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 :

Fonction recursive (hors gestion par intervalle)


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 8
    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 ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    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 ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 8
    Par défaut
    je travaille avec la 9i, et 11gR1,11gR2

    Exemple j'ai une table nommé table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ça fonctionnera en 9i et 11g :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 8
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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]

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

Discussions similaires

  1. [WD14] fonction recursive gestion date de peremption
    Par tonioboss dans le forum WinDev
    Réponses: 10
    Dernier message: 28/06/2012, 14h25
  2. [Débutant] Fonction definie par intervalle
    Par lassaib dans le forum MATLAB
    Réponses: 3
    Dernier message: 12/02/2011, 18h14
  3. fonction utilisateur non reconue par sql server 2000
    Par ouedmouss dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/09/2005, 07h46
  4. [10g]Fonction des nouveaux services par rapport à la 9i
    Par Laurent Dardenne dans le forum Oracle
    Réponses: 13
    Dernier message: 04/07/2005, 13h56
  5. [Concept] BD ou Gestion par fichier. Intérêt de la BD ?
    Par Cian dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/11/2002, 12h16

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