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

Administration Oracle Discussion :

erreur "ORA-22905" lors de l'execution d'un requet


Sujet :

Administration Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut erreur "ORA-22905" lors de l'execution d'un requet
    Lorsque j'execute le code suivant j'ai l'erreur :
    "ORA-22905: impossible d'accéder aux lignes d'un element qui n'appartient pas à une table imbriquée"

    Vous avez une piste pour m'aider ?

    Function :
    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
     
    CREATE or REPLACE FUNCTION virtual_table RETURN virtual_table_type
     PIPELINED  IS 
        CURSOR recs_source IS 
          SELECT NAME 
          FROM   dtree ; 
      BEGIN 
        OPEN recs_source; 
        LOOP 
     
          FETCH recs_source INTO monname; 
          EXIT WHEN recs_source%NOTFOUND; 
          pipe row( monname ); 
        END LOOP; 
        CLOSE recs_source; 
        RETURN; 
      END;


    Execution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from TABLE( cast ( virtual_table() as virtual_table_type ) );

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Peut tu tenter de lancer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter session set cursor_sharing=exact;
    juste avant

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    j'ai executer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alter session set cursor_sharing=exact
    juste avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from TABLE( cast ( virtual_table() as virtual_table_type ) );
    ca ne change rien

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par helyos
    Peut tu tenter de lancer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter session set cursor_sharing=exact;
    juste avant
    dans quel but :

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Alors en fait c'est une commande qui permet de faire ce qui suis (grosse pas envie de traduire )

    You may benefit running this by the PL/SQL group for more details, but with cursor sharing set to similar, literal replacement kicks
    in. Queries with binds and table functions and select * in the topmost query block cannot avoid the usage of the CAST..AS construct.

    From bug 1702058 (unpublished unfortunately):

    "Essentially, the number of items on the the select list is not available till the end of semantic analysis. If semantic analysis is deferred, then this information isn't available till the first phase of typecheck.

    In the absence of any information as to the size of the select list, we will have to perform to grow/shrink the size of the define list. We will also have to defer any error raising (number of defines does not match number of select list items) till the semantic analysis phase is complete."

    So you get this errror. Setting cursor_sharing=exact seems to get around this although the workaround in the bug is to use CAST. Something like

    select *
    from table(cast(dbms_xplan.display('plan_table')
    as dbms_xplan_type_table));

    The PL/SQL group will be better able to help advise on how to use the CAST functionality with your query

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Points : 605
    Points
    605
    Par défaut
    il me semble que "monname" n'est pas défini dans ta fonction

    es-tu certain qu'elle se compile?

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Arg désolé la j'ai fait une gaffe c'est pas dans le meme cas d'utilisation.

    Mea culpa

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Heuuu... oui mais là il y a méprise il me semble... le cursor_sharing permet de donner un degré de pécision au partage des curseurs pour retrouver un plan d'exécution.

    Exemple en cursor_sharing=similar, lorsque la requête suivante sera exécutée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from toto where tata='titi'
    elle sera enregistrée sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from toto where tata=:1
    Donc le plan d'éxécution ne sera pas recalculé pour les prochaines requête de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from toto where tata=???
    D'où mon étonnement, je ne vois pas le rapport avec le probléme

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par helyos
    Arg désolé la j'ai fait une gaffe c'est pas dans le meme cas d'utilisation.

    Mea culpa
    j'comprends mieux

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    non elle compile pas, j'ai corrigé l'erreur de la variable non déclarer.
    Mais la compilation me fait une erreur sur le mot et
    c'est des mots connus dans la 8i non

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par orafrance
    Citation Envoyé par helyos
    Arg désolé la j'ai fait une gaffe c'est pas dans le meme cas d'utilisation.

    Mea culpa
    j'comprends mieux
    l'explication est clair je l'ai comprise

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est quoi l'erreur exact sur le mot clé, tu peux remettre le code avec la déclaration de monname STP ?

  13. #13
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Points : 605
    Points
    605
    Par défaut
    si elle n'est pas compilée, ça ne risque pas de marcher

    apparemment pas supporté par ta version d'oracle (vérifie dans ta doc)

    bonne chance

    Marc

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Voici le code
    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
     
    CREATE OR REPLACE PACKAGE BODY test IS
     
      FUNCTION montest RETURN dictionary PIPELINED  IS 
        CURSOR recs_source IS 
          SELECT NAME 
          FROM   dtree ; 
        bren    dictionary; 
        monname VARCHAR2(10000); 
        i       INTEGER; 
      BEGIN 
        OPEN recs_source; 
        i := 1; 
        LOOP 
          FETCH recs_source 
            INTO monname; 
          EXIT WHEN recs_source%NOTFOUND; 
          pipe row(i) := monname; 
          i := i + 1; 
        END LOOP; 
        CLOSE recs_source; 
        RETURN; 
      END; 
     
    END;
    l'erreur est la suivante :

    Symbole "PIPELINED" rencontré à la place d'un des symbole suivant : .@%; is authid determinics parallel_enable as charater Symbole "." a été substitué à "PIPELINED" pour continuer

  15. #15
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    le vrai code :
    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
     
    CREATE OR REPLACE PACKAGE BODY test IS
     
      FUNCTION montest RETURN dictionary PIPELINED  IS 
        CURSOR recs_source IS 
          SELECT NAME 
          FROM   dtree ; 
        bren    dictionary; 
        monname VARCHAR2(10000); 
        i       INTEGER; 
      BEGIN 
        OPEN recs_source; 
        i := 1; 
        LOOP 
          FETCH recs_source 
            INTO monname; 
          EXIT WHEN recs_source%NOTFOUND; 
          pipe row(monname); 
          i := i + 1; 
        END LOOP; 
        CLOSE recs_source; 
        RETURN; 
      END; 
     
    END;

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    comme le dit Marc, il est temps pour toi de vérifier si ta version d'Oracle supporte le PIPELINE

  17. #17
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Ma version ne suporte pas PIPELINED ( )

    Comment faire pour aboutir au meme resultat sans "PIPELINED" ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Explique ce que tu veux exactement obtenir comme résultat et on essayera de te trouver une solution

  19. #19
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    j'utilise un produit qui permet de faire des report.
    Ce produit ne peut faire que requete simple :
    Malheureusement le report que je doit faire est compliqué (multitable avec des stats) et il renvoit plusieurs lignes (environ 50) je suis donc obligé d'utiliser une procédure stocké ou une fonctions.

    Mais je suis aussi obligé d'utiliser la structure du select .... pour pouvoir interfacer le resultat du traitement avec le produit que j'utilise.

    voila mon probléme 8) , mon idée etait donc d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from table( cast ( test.montest() as test.dictionary) )

    Alors une idée ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Pourquoi ne pas passer par des vues ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Délai expiré lors de l'execution d'une requete sqlserver
    Par lc.soft dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 29/09/2015, 11h41
  2. Erreur lors de l'execution d'une requete SQL
    Par Mordehai dans le forum WinDev
    Réponses: 1
    Dernier message: 04/06/2012, 12h05
  3. affichage d'une progressbar lors de l'execution d'une requete
    Par RodEpsi dans le forum Bases de données
    Réponses: 30
    Dernier message: 13/12/2006, 11h53
  4. [ADO] Probleme lors de l'execution d'une requete...
    Par NoisetteProd dans le forum Bases de données
    Réponses: 4
    Dernier message: 04/06/2004, 12h43

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