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

Oracle Discussion :

Erreur Ora-32044 : cycle détecté avec WITH [11gR2]


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2011
    Messages : 89
    Par défaut Erreur Ora-32044 : cycle détecté avec WITH
    Salutation,

    je crée actuellement un script qui doit la permettre de remplir une table a partir des données d'une autre table.

    Dans la premiere table, j'ai

    matricule | MemberOf
    -------------------------------
    0000001   | toto, tata, titi
    0000002   | toto
    0000003   | titi, tota
    et je voudrais obtenir
    matricule | MemberOf
    -------------------------------
    0000001   | toto
    0000001   | tata
    0000001   | titi
    0000002   | toto
    0000003   | titi
    0000003   | tota
    après mettre renseigné on m'a conseillé une boucle récursive qui découpe ma chaine Memberof en fonction des virgules... le problème est que lors de l'execution de ma requete je tombe sur cette erreur "ORA-32044: cycle détecté lors de l'exécution de la requête WITH récursive"

    et que je comprend pas tres bien d'ou peut venir ce défaut...

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    WITH Recup (matricule, Unmemberof, LesAutresYga) AS
    (
       SELECT 
    	MATRICULE, 
    	CASE 
    		WHEN INSTR(',', MEMBEROF)>0 THEN 
    			LTRIM(SUBSTR(MEMBEROF,1, INSTR(',', MEMBEROF) -1))
    		ELSE 
    			MEMBEROF
    	END AS UNMEMBEROF,
    	LTRIM(SUBSTR(MEMBEROF, INSTR(',', MEMBEROF) +1, LENGTH(MEMBEROF) - INSTR(',', MEMBEROF))) AS LESAUTRESYGA
     
       FROM COMPTES_AD
     
      UNION ALL
     
       SELECT 
    	COMPTES_AD.MATRICULE, 
    	CASE 
    		WHEN INSTR(',' , Recup.LesAutresYga)>0 THEN 
    			LTRIM(SUBSTR(Recup.LesAutresYga,1, INSTR(',',Recup.LesAutresYga) -1))
    		ELSE 
    			Recup.LesAutresYga
    	END,
    	CASE 
    		WHEN INSTR(',' , Recup.LesAutresYga)>0 THEN
    			 LTRIM(SUBSTR(Recup.LesAutresYga, INSTR(',', Recup.LesAutresYga) +1, LENGTH(Recup.LesAutresYga) - INSTR(',',Recup.LesAutresYga)))
    		ELSE
    			 NULL
    	END
       FROM COMPTES_AD 
    	INNER JOIN Recup ON Recup.Matricule = COMPTES_AD.Matricule 
       WHERE 
    	LesAutresYga IS NOT NULL
    )
    SELECT DISTINCT *
    FROM RECUP
    merci de votre aide.

    Edit : version d'oracle : inconnue (ce n'est pas moi qui gere cela mais je dirais 10g ou 11g...)

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Regardez [Oracle 10g]Transformer les éléments d'une liste en enregistrement

    PS : Si vous pouvez faire du WITH récursif c'est que vous êtes en 11GR2, mais vous pouvez le vérifier en exécutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from v$version

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2011
    Messages : 89
    Par défaut
    Bonjour,

    merci à toi pour ta reponse.

    concernant la version j'obtiens : Oracle Database 11g Release 11.2.0.3.0 - 64bit Production. donc oui je pense que c'est la 11gR2. pour la liste je vais regarder ca et je tiens au jus...

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Sinon, je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with sample_data as
    (
     select '0000001' matrice, 'toto, tata, titi' memberof from dual union all
     select '0000002', 'toto' from dual union all
     select '0000002', 'titi, tota' from dual
    )
    select matrice, cast(t.column_value.extract('//text()') as varchar2(10)) val
      from sample_data,
      table( xmlsequence( xmltype(
        '<x><x>' || replace(replace(memberof,' ',null), ',', '</x><x>') || '</x></x>'
      ).extract('//x/*'))) t;
    MATRICE VAL
    ------- ----------
    0000001 toto
    0000001 tata
    0000001 titi
    0000002 toto
    0000002 titi
    0000002 tota
    Note : replace(memberof,' ',null) pour supprimer les espaces

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2011
    Messages : 89
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Sinon, je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with sample_data as
    (
     select '0000001' matrice, 'toto, tata, titi' memberof from dual union all
     select '0000002', 'toto' from dual union all
     select '0000002', 'titi, tota' from dual
    )
    select matrice, cast(t.column_value.extract('//text()') as varchar2(10)) val
      from sample_data,
      table( xmlsequence( xmltype(
        '<x><x>' || replace(replace(memberof,' ',null), ',', '</x><x>') || '</x></x>'
      ).extract('//x/*'))) t;


    Note : replace(memberof,' ',null) pour supprimer les espaces
    Cette solution est bien sauf que j'ai 1650 matricule et un nombre de memberOf aléatoires compris entre 0 et 16000 pour chaque matricule...

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Citation Envoyé par nid4mail Voir le message
    Cette solution est bien sauf que j'ai 1650 matricule et un nombre de memberOf aléatoires compris entre 0 et 16000 pour chaque matricule...
    La partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH sample_data AS
    (
     SELECT '0000001' matrice, 'toto, tata, titi' memberof FROM dual union ALL
     SELECT '0000002', 'toto' FROM dual union ALL
     SELECT '0000002', 'titi, tota' FROM dual
    )
    sert à simuler des données pour tester la requête, vous n'avez pas à l'utiliser dans votre requête finale.

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    En effet, la requête serait quelque chose de ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT matrice, cast(t.column_value.extract('//text()') AS varchar2(10)) unmemberof
      FROM comptes_ad,
      TABLE( xmlsequence( xmltype(
        '<x><x>' || REPLACE(REPLACE(memberof,' ',NULL), ',', '</x><x>') || '</x></x>'
      ).extract('//x/*'))) t;

  8. #8
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2011
    Messages : 89
    Par défaut
    Citation Envoyé par orafrance Voir le message
    En effet, la requête serait quelque chose de ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT matrice, cast(t.column_value.extract('//text()') AS varchar2(10)) unmemberof
      FROM comptes_ad,
      TABLE( xmlsequence( xmltype(
        '<x><x>' || REPLACE(REPLACE(memberof,' ',NULL), ',', '</x><x>') || '</x></x>'
      ).extract('//x/*'))) t;
    Et dans mon With je ferais un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select Matricule, MemberOf from Comptes_AD dual
    ?

    (je debute avec Oracle je patauge un peu beaucoup (merci de votre patience en tout cas)

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

Discussions similaires

  1. Erreur ORA-12154 si lancé avec Cron
    Par dj_benz dans le forum Connexions aux bases de données
    Réponses: 11
    Dernier message: 30/07/2008, 19h05
  2. Erreur ORA-01841 seulement avec un paramètre
    Par alband85 dans le forum C#
    Réponses: 3
    Dernier message: 10/07/2008, 15h39
  3. erreur ora-00907 avec oracle
    Par mehdiyou dans le forum SQL
    Réponses: 3
    Dernier message: 11/04/2008, 22h53
  4. probleme avec erreur ORA-01536
    Par ka0z dans le forum Oracle
    Réponses: 7
    Dernier message: 12/03/2007, 16h34
  5. Erreur ORA-12514 avec database link
    Par gafreu dans le forum Administration
    Réponses: 20
    Dernier message: 09/09/2004, 11h53

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