Bonjour,
Savez vous s'il est possible d'augmenter le nombre maximum de paramètres dans un IN.
Actuellement je suis limité à 1000 valeurs.Code:select * from monTab where monTab.id IN (1,2,...,1000)
Version imprimable
Bonjour,
Savez vous s'il est possible d'augmenter le nombre maximum de paramètres dans un IN.
Actuellement je suis limité à 1000 valeurs.Code:select * from monTab where monTab.id IN (1,2,...,1000)
Utilisez une collection ou une table temporaire.
[Edit]
Voilà un lien qui contient un exemple.
[/Edit]
J'ai essayé cette solution avec le code suivant:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Connected TO Oracle9i Enterprise Edition Release 9.2.0.7.0 Connected AS mni SQL> CREATE OR REPLACE type vStr AS varray(2000) of varchar2(10) 2 / Type created SQL> SQL> SELECT e.* 2 FROM emp e, 3 TABLE(vStr('7900','7369','7499')) a 4 WHERE To_Number(a.column_value) = e.empno 5 / EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7900 JAMES CLERK 7698 03/12/1981 950,00 30 7369 SMITH CLERK 7902 17/12/1980 800,00 20 7499 ALLEN SALESMAN 7698 20/02/1981 1600,00 300,00 30 SQL>
CREATE OR REPLACE type vStr AS varray(1000000) of varchar2(10)
avec 2000 paramètres j'ai un retour erreur:
Query OK, 0 rows affected (16 ms)
ORA-00939: too many arguments for function
Je vais creuser les collections. Merci pour les pistes.
tu ne peux pas avoir un varray ou une collection définie avec 2000 arguments dans le constructeur.
Quel est ton client? sqlplus?
En dernier recours je tenterais :
Mais ce ne serait pas mieux d'avoir une table temporaire?Code:
1
2
3
4
5
6 SELECT * FROM monTab WHERE monTab.id=1 or monTab.id=2 ... or monTab.id=2000;
Laurent,
Peut être je t’ai mal compris mais, on n’a pas besoin de passer les 2000 valeurs dans le constructeur.
Code:
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 C:\Documents and Settings\mnitu>sqlplus mni/Mni SQL*Plus: Release 10.2.0.1.0 - Production on Jeu. Sept. 24 11:54:30 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved. ConnectÚ Ó : Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production SQL> set serveroutput on SQL> CREATE OR REPLACE type vStr AS varray(10000) of varchar2(10) 2 / Type crÚÚ. SQL> SQL> declare 2 l_vstr vstr:= vstr(); 3 Begin 4 -- initialisation 5 For i in 1..10000 Loop 6 l_vstr.extend; 7 l_vstr(i) := to_char(i); 8 end loop; 9 -- 10 For c_emp In (SELECT e.* 11 FROM emp e, 12 TABLE(l_vStr) a 13 WHERE To_Number(a.column_value) = e.empno 14 ) 15 Loop 16 dbms_output.put_line(c_emp.ename); 17 End Loop; 18 End; 19 / SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER ProcÚdure PL/SQL terminÚe avec succÞs.
Salut !
J'ai une solution qui sent mauvais :
Tu mets tous tes éléments dans une seule chaine de caractères séparés par un truc fixe, et tu les parses à la volée avec CONNECT BY LEVEL, SUBSTR et INSTR :
Code:
1
2
3
4 SELECT SUBSTR('/1000/2000/1/300/15/39/', INSTR('/1000/2000/1/300/15/39/', '/', 1, level) + 1, INSTR('/1000/2000/1/300/15/39/', '/', 1, level + 1) - INSTR('/1000/2000/1/300/15/39/', '/', 1, level) + 1 - 2) FROM DUAL CONNECT BY LEVEL <= 5
Citation:
RES
-----------------------
1000
2000
1
300
15