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 04/10/2004, 11h22   #1
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
Par défaut [PL/SQL] Utilisation table PL/SQL dans clause IN

bonjour,
j'aimerais savoir si il est possible et si oui quelle est la syntaxe pour utiliser une table PL/SQL dans la clause IN d'un Select...

merci d'avance,

PS le tableau PL sera chargé à partir d'un curseur...
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2004, 11h25   #2
Rédacteur
 
Inscription : septembre 2004
Messages : 626
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 626
Points : 622
Points : 622
Je n'ai pas de solution mais dans le même genre j'aimerais savoir s'il est possible de faire un truc comme :
Code :
SELECT * FROM ... WHERE id IN (c)
où c est un curseur, je pense que ca ressemble fortement au probleme de Yorglaa.

J'ai des fonctions stockées qui me renvoient un ref cursor et au lieu de faire une table temporaire dans laquelle je mets tous les identifiants fetchés à partir du curseur, est-il possible d'utiliser directement le contenu du curseur dans une requête ?


Laly.
__________________
In the heart of the truly greats, perfection is never achieved but endlessly pursued.

Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)
lalystar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2004, 12h28   #3
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
Et bien, c'est chaud...

tout ce que je peux faire est de créer une fonction PIPELINED

Code :
CREATE TYPE table_char IS TABLE OF VARCHAR2(100) ;
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE OR REPLACE FUNCTION test_refcursor (cur_lig IN SYS_REFCURSOR)
   RETURN table_char PIPELINED
 IS
  t table_char ;
  v varchar2(100) ;
 Begin
  Loop
    Fetch cur_lig INTO v ;
    Exit When cur_lig%NOTFOUND ;
      -- Retour des valeurs --
      PIPE ROW( v ) ;
  End loop ;
  RETURN ;
  End ;
que j'appelle de la façon suivante :

Code :
1
2
3
 
SELECT * FROM messages
WHERE code IN ( SELECT * FROM TABLE(test_refcursor(CURSOR(SELECT code FROM messages))) )
Bien sûr cela ne répond pas complètement à la question mais peut représenter une base de recherche...
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2004, 13h42   #4
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
Super merci...

je vais essayer ça ...
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2004, 09h45   #5
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
et pourquoi pas simplement l'utilisation d'une boucle avec FORALL : http://download-west.oracle.com/docs/cd/A87860_01/doc/appdev.817/a77069/05_ora.htm#36174

Au niveau perf ce sera exactement pareil
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2004, 09h53   #6
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
J'imagine que le but est d'alimenter une clause IN() avec n'importe quel curseur passé en argument.
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2004, 09h54   #7
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
Et bien, tu peux alimenter une table avec n'importe quel curseur et utiliser un FORALL et une égalité en lieu et place du IN
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2004, 10h02   #8
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
Et bien c'est ce que fait la fonction pipelined.

Il faudrait essayer de lui transmettre directement un pointeur de type REFCURSOR (au lieu du select)
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2004, 10h06   #9
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
Ha bon... le pipeline me semble bigrement compliqué par rapport au FORALL c'est pour ça... je pense à la TMA
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2004, 10h26   #10
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
euhhh désolé pour la question basique... mais vous pourriez juste me rappeler la syntaxe du FORALL ?
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2004, 10h27   #11
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
c'est expliqué dans l'article : Guide PL/SQL....
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2004, 10h29   #12
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
j'ai donné le lien juste au dessus

Code :
1
2
3
4
5
6
7
8
9
10
DECLARE
   TYPE NumList IS VARRAY(20) OF NUMBER;
   depts NumList := NumList(10, 30, 70, ...);  -- department numbers
BEGIN
   ...
   FOR i IN depts.FIRST..depts.LAST LOOP
      ...
      UPDATE emp SET sal = sal * 1.10 WHERE deptno = depts(i);
   END LOOP;
END;
Devient :

Code :
1
2
3
4
5
6
7
DECLARE
   TYPE NumList IS VARRAY(20) OF NUMBER;
   depts NumList := NumList(10, 30, 70, ...);  -- department numbers
BEGIN
  FORALL i IN depts.FIRST..depts.LAST
   UPDATE emp SET sal = sal * 1.10 WHERE deptno = depts(i);
END;
A lire aussi : http://download-west.oracle.com/docs/cd/A87860_01/doc/appdev.817/a77069/04_colls.htm#23723
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2004, 10h35   #13
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
oups, pardon à vous deux

je vais aller piocher dans le guide de Sheik et dans les liens à orafrance...

désolé encore j'ai réagi trop vite... je je voulais froisser personne !
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2004, 10h36   #14
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
Pas de probléme
orafrance 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 11h21.


 
 
 
 
Partenaires

Hébergement Web