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 :

PL/SQL : Utilisation d'une variable de type table dans un select


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 10
    Points : 12
    Points
    12
    Par défaut PL/SQL : Utilisation d'une variable de type table dans un select
    Bonjour,

    Je suis débutant en plsql, et voici ce que je souhaite faire :
    1) effectuer un select sur une table pour déterminer une liste de rejet,
    2) stocker les rowid de ces lignes dans une variable table
    3) effectuer un update sur la table en excluant ces rowid.

    Pour cela, j'emploi la démarche suivante (et ça ne marche pas ...):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- Décalration du tableau 
    TYPE rec_rowid IS RECORD (idrow ROWID);
    TYPE list_rowid IS TABLE OF rec_rowid INDEX BY BINARY_INTEGER;	 
    t_list_rowid list_rowid;
    
    -- REQUETE 1 : Récuperation des éléments en rejets
    Select T1.ROWID BULK COLLECT INTO t_list_rowid from TABLE1 T1 where (select count(T2.CHAMP1) from TABLE2 T2, TABLE3 T3 where CONDITIONS) > 1;
    
    -- REQUETE 2 : Mise à jour des éléments sauf rowid en rejet
    update TABLE1 T1 set T1.CHAMP1 = (select distinct(T3.CHAMP1) from TABLE3 T3, TABLE2 T2 where CONDITIONS) WHERE p.rowid not in (select idrow from t_list_rowid);
    La condition en rouge génére l'erreur suivante : PL/SQL: ORA-00942: Table ou vue inexistante.

    J'ai également essayé la forme suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND T1.rowid not in t_list_rowid
    Mais ça génére l'erreur suivante : PLS-00382: expression du mauvais type

    Existe il un moyen d'utiliser mon tableau comme je le souhaite (utilisation d'une variable de type TABLE comme un objet table oracle) ?

    PS : en raison du volume de la table 1 (300 Millions de rows), impossible d'imbriquer la requete 1 dans la requete 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND T1.rowid not in (Requete 1)
    Fricky

  2. #2
    Invité
    Invité(e)
    Par défaut
    c'est une très mauvaise idée d'utiliser le rowid pour identifier une ligne, puisque le rowid n'est pas constant.
    Utilise tout simplement la clé primaire.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Le problème est le même avec la clé primaire :
    Mon problème est lié à l'utilisation du tableau. Ci dessous, le code mis à jour pour utiliser la clé. Comment ecrire la clause en gras pour que cela fonctionne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    -- Décalration du tableau 
    TYPE rec_cle IS RECORD (cle NUMBER(20));
    TYPE list_cle IS TABLE OF rec_cle INDEX BY BINARY_INTEGER;	 
    t_list_cle list_cle;
    
    -- REQUETE 1 : Récuperation des éléments en rejets
    Select T1.cle BULK COLLECT INTO t_list_cle from TABLE1 T1 where (select count(T2.CHAMP1) from TABLE2 T2, TABLE3 T3 where CONDITIONS) > 1;
    
    -- REQUETE 2 : Mise à jour des éléments sauf cles en rejet
    update TABLE1 T1 set T1.CHAMP1 = (select distinct(T3.CHAMP1) from TABLE3 T3, TABLE2 T2 where CONDITIONS) WHERE T1.cle not in (select cle from t_list_cle);
    --> PL/SQL: ORA-00942: Table ou vue inexistante.

    Idem avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND T1.cle NOT IN t_list_cle
    --> PLS-00382: expression du mauvais type
    Fricky

  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 : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    c'est pas un tableau mais un curseur que le IN attend. Il faut donc une variable REF CURSOR.

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Tu ne peut pas faire Select … From variable de type tableau (collection). Soit:
    • à la place du tableau tu utilise une table temporaire: (create table tlog as select ... from ta_table Where ...)
    • Tu écrit une fonction qui transforme le tableau dans une table, de type Select … From procédure PL/SQL de type pipe

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Merci !

    Je ne maitrise pas trop le concept de REF CURSOR dans la requête. J'ai donc utilisé la table temporaire.
    Fricky

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/04/2010, 09h34
  2. [SQL Server] Insert et Variable de type Table
    Par patriceharel dans le forum Développement
    Réponses: 3
    Dernier message: 10/02/2009, 16h32
  3. ré-initialiser un identity sur une variable de type table
    Par laurent-devel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 31/03/2008, 19h39
  4. Réponses: 2
    Dernier message: 10/03/2008, 00h02
  5. Pl/SQL utilisation d'une variable dans un select
    Par larg dans le forum PL/SQL
    Réponses: 17
    Dernier message: 30/11/2004, 17h08

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