En bref, la clause IN ne prend pas en charge les variables de liaison.. Elle ne prend en charge que la valeur, de la manière que vous avez utilisée.. Vous devez le spécifier comme IN (var1, var2)
;
Sans vous connaître, vous avez utilisé des variables liées. Une solution de contournement consiste à utiliser REFCURSOR
En formant dynamiquement une chaîne de requête.
DECLARE
VAR1 VARCHAR2(500);
CUR1 SYs_REFCURSOR;
QUERY_STRING VARCHAR2(2000) := 'SELECT T.COL1 FROM TABLE1 T WHERE T.COL1 IN';
MYREC IS RECORD
(
COL1 VARCHAR(1000);
);
myrecord MYREC;
BEGIN
VAR1 := q'['V1','V2']';
QUERY_STRING:= QUERY_STRING||'('||VAR1||')';
OPEN CUR1 FOR QUERy_STRING;
LOOP
FETCH CUR1 INTO myrecord;
DBMS_OUTPUT.PUT_LINE(myrecord.COL1);
EXIT WHEN v_my_ref_cursor%NOTFOUND;
..
-- your processing
END LOOP;
CLOSE CUR1;
END;
Une de mes autres réponses a également un autre moyen d'utiliser des collections, pour une plus grande liste de clauses IN.