Oracle
 sql >> Base de données >  >> RDS >> Oracle

Curseur dynamique Oracle

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.