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 :

ORA-22905 : Accéder aux éléments d'une liste de NUMBER


Sujet :

Oracle

  1. #1
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut ORA-22905 : Accéder aux éléments d'une liste de NUMBER
    Bonjour,

    J'ai une erreur assez étrange (pour moi ) lorsque j'effectue la requete suivante dans mon package:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    -- Duplication de lignes
    INSERT INTO ma_table 
    VALUES (
        SELECT * FROM ma_table WHERE maColId IN 
              (SELECT LISTE.COLUMN_VALUE FROM TABLE(ma_liste) LISTE));
    Le paramètre "ma_liste" en entrée de la procédure est de type NUMBER_ARRAY:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create or replace type NUMBER_ARRAY as table of NUMBER;
    La compilation se passe bien mais a l'exécution j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: ORA-22905: impossible d'accéder aux lignes d'un élément qui n'appartient pas à une table imbriquée
    Par contre si je fais juste une sélection, tout se passe bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ??? INTO ??? FROM ma_table WHERE maColId = 
              (SELECT LISTE.COLUMN_VALUE FROM TABLE(ma_liste) LISTE));
    Merci pour votre aide par avance.

    Vincent

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Quelle est votre version d'Oracle ?

    Parfois il y a des fonctionnalités qui fonctionnent en SQL et qui ne marchent pas en PL/SQL.

  3. #3
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    Effectivement je ne vous ai pas donné ma version d'Oracle.

  4. #4
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    Je n'ai toujours pas trouver de solution à ce problème.
    Auriez vous une idée pour contourner cela.
    Je pensais à boucler sur ma liste de NUMBER afin d'écrire une chaine de caractère qui contiendrait les valeurs séparées par des virgules et de l'incorporer dans une requete et enfin de faire un EXECUTE IMMEDIATE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'DELETE FROM ma_table WHERE COL_ID IN ('||ma_chaine||')'
    Mais cela ne me plait pas trop.

    Avait vous d'autres idées?
    Merci

  5. #5
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Essayez toujours de caster votre collection...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT LISTE.COLUMN_VALUE FROM TABLE(CAST(ma_liste) AS NUMBER_ARRAY) LISTE
    Sinon il y a toujours l'article suivant

  6. #6
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    J'ai finalement réussi à faire fonctionner le tout avec Oracle 9.2.0.6 avec le script suivant:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    QL> drop table matable
    Table dropped.
    SQL> create table matable (x int, y int)
    Table created.
    SQL> insert into matable values(1, 1)
    1 row created.
    SQL> insert into matable values(2, 2)
    1 row created.
    SQL> commit
    Commit complete.
    SQL> create or replace type an as table of number;
    Type created.
    SQL> create or replace package p
    is
           procedure f;
    end;
    Package created.
    SQL> show errors
    No errors.
    SQL> create or replace package body p
    is
     procedure f
     is 
     ma_liste an := an();
     c integer;
     rt matable%rowtype;
     begin  
      ma_liste.extend(2);
      ma_liste(1) := 1;
      ma_liste(2) := 2;
     INSERT INTO matable
      (SELECT * FROM matable WHERE y IN 
        (SELECT liste.column_value FROM TABLE(CAST (ma_liste AS an)) liste));
      COMMIT;
     end;
    end;
    Package body created.
    SQL> show errors
    No errors.
    SQL> set serveroutput on size 1000000
    SQL> select * from matable
     
             X          Y
    ---------- ----------
             1          1
             2          2
     
    2 rows selected.
    SQL> exec p.f
    PL/SQL procedure successfully completed.
    SQL> select * from matable
     
             X          Y
    ---------- ----------
             1          1
             2          2
             1          1
             2          2
     
    4 rows selected.
    Mais ce serait quand même mieux si:
    - on avait des scripts complets pour essayer de reproduire les problèmes
    (sans des erreurs de syntaxe du type
    INSERT INTO ma_table
    VALUES (
    SELECT
    )
    - la version d'Oracle était tout de suite indiquée car je crois qu'en 10g le CAST n'est pas nécessaire

  7. #7
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Citation Envoyé par pifor
    - la version d'Oracle était tout de suite indiquée ...
    Ce n'est pourtant pas faute de le rappeler ...

  8. #8
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    Clap clap clap

    Le CAST fonctionne parfaitement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO ASSOCIATION (ASSOCIATION_ID, ............)
    SELECT SEQ_ASSOCIATION.NEXTVAL, .......
    FROM ASSOCIATION WHERE PARCELLE_ID = (SELECT PARCELLE_ID FROM ASSOCIATION WHERE ASSOCIATION_ID NOT IN (SELECT TBL.COLUMN_VALUE FROM TABLE(CAST(listeAssToDelete_ AS NUMBER_ARRAY)) TBL);
    Par contre je ne comprends pas pourquoi il faut que je "cast" ma liste alors que je la passe dans les paramètres de la fonction avec le bon type.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FUNCTION duplicateAssocAddedToDelete(idAssociation_ IN NUMBER, listeAssToDelete_ NUMBER_ARRAY) RETURN NUMBER IS
    Je vous remercie pour votre aide rapide et précieuse.

    Vincent

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

Discussions similaires

  1. Comment accéder aux éléments d'une sous formulaire en javascript
    Par oumelkhairat dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/11/2013, 16h15
  2. Réponses: 1
    Dernier message: 26/11/2009, 12h29
  3. Donner un code aux éléments d'une List
    Par youtch dans le forum Flex
    Réponses: 7
    Dernier message: 12/11/2009, 18h48
  4. [Toutes versions] Accéder aux éléments d'une plage nommée dans une formule
    Par TOM3110 dans le forum Excel
    Réponses: 1
    Dernier message: 13/05/2009, 11h53
  5. comment accéder aux éléments d'une liste
    Par RouRa22 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 07/05/2008, 13h53

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