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...
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...
Je n'ai pas de solution mais dans le même genre j'aimerais savoir s'il est possible de faire un truc comme :où c est un curseur, je pense que ca ressemble fortement au probleme de Yorglaa.
Code : Sélectionner tout - Visualiser dans une fenêtre à part select * from ... where id in (c)
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...)
Et bien, c'est chaud...
tout ce que je peux faire est de créer une fonction PIPELINED
Code : Sélectionner tout - Visualiser dans une fenêtre à part CREATE TYPE table_char IS TABLE OF VARCHAR2(100) ;que j'appelle de la façon suivante :
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 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 ;
Bien sûr cela ne répond pas complètement à la question mais peut représenter une base de recherche...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select * from messages where code in ( select * from table(test_refcursor(CURSOR(Select code from messages))) )
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![]()
J'imagine que le but est d'alimenter une clause IN() avec n'importe quel curseur passé en argument.
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![]()
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)
Ha bon... le pipeline me semble bigrement compliqué par rapport au FORALL c'est pour ça... je pense à la TMA![]()
euhhh désolé pour la question basique... mais vous pourriez juste me rappeler la syntaxe du FORALL ?
j'ai donné le lien juste au dessus![]()
Devient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
A lire aussi : http://download-west.oracle.com/docs/cd/A87860_01/doc/appdev.817/a77069/04_colls.htm#23723
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
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 !![]()
Partager