Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/01/2008, 13h12   #1
Invité de passage
 
Inscription : août 2002
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 9
Points : 4
Points : 4
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 :
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 :
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 :
AND T1.rowid NOT IN (Requete 1)
Fricky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2008, 15h12   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
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.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2008, 15h41   #3
Invité de passage
 
Inscription : août 2002
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 9
Points : 4
Points : 4
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 :
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 :
AND T1.cle NOT IN t_list_cle
--> PLS-00382: expression du mauvais type
Fricky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2008, 16h04   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est pas un tableau mais un curseur que le IN attend. Il faut donc une variable REF CURSOR.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2008, 16h13   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 319
Points : 5 837
Points : 5 837
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
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2008, 09h54   #6
Invité de passage
 
Inscription : août 2002
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 9
Points : 4
Points : 4
Merci !

Je ne maitrise pas trop le concept de REF CURSOR dans la requête. J'ai donc utilisé la table temporaire.
Fricky est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h49.


 
 
 
 
Partenaires

Hébergement Web