PL / SQL-utiliser la Variable "List" dans Where in Clause

dans PL / SQL, comment déclarer des valeurs Mylistof qui contiennent des valeurs multiples (MyValue1, MyValue2, etc.)

SELECT * 
FROM DatabaseTable 
WHERE DatabaseTable.Field in MyListOfValues

j'utilise Oracle SQL Developer

3
demandé sur a_horse_with_no_name 2016-02-05 22:13:58

3 réponses

utiliser une collection:

CREATE TYPE Varchar2TableType AS TABLE OF VARCHAR2(200);

ou utiliser un type incorporé comme SYS.ODCIVARCHAR2LIST ou SYS.ODCINUMBERLIST :

VARIABLE cursor REFCURSOR;

DECLARE
  your_collection SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
BEGIN
  your_collection.EXTEND( 100 );

  your_collection(  1) := 'Some value';
  your_collection(  2) := 'Some other value';
  -- ...
  your_collection(100) := DBMS_RANDOM.STRING( 'x', 20 );

  OPEN :cursor FOR
  SELECT t.*
  FROM   your_table t
         INNER JOIN
         TABLE( your_collection ) c
         ON t.id = c.COLUMN_VALUE;
END;
/

PRINT cursor;
5
répondu MT0 2016-02-05 19:39:37

créer le type SQL comme ceci:

CREATE TYPE MyListOfValuesType AS TABLE OF VARCHAR2(4000);

et ensuite l'utiliser dans une instruction SQL

DECLARE
  MyListOfValues MyListOfValuesType;
BEGIN
  MyListOfValues := MyListOfValuesType('MyValue1', 'MyValue2');

  FOR rec IN (
    SELECT *
    FROM DatabaseTable
    WHERE DatabaseTable.Field in (
      SELECT * FROM TABLE(MyListOfValues)
    )
  )
  LOOP
    ...
  END LOOP;
END;

Jusqu'à Oracle 11g, cela ne fonctionne qu'avec un type SQL TABLE , pas avec un type PL/SQL TABLE . Avec Oracle 12c, vous pouvez également utiliser les types PL/SQL.

3
répondu Lukas Eder 2016-02-05 19:25:19

pourquoi ne pas utiliser une clause avec laquelle on construit une table de travail? Pas de réel réutilisables. Vous pourriez utiliser un tableau ou je dirais que se joindre à une table de recherche serait mieux.

WITH MyListOfValues(col1) AS (
  select 'MyValue1' from dual union
  select 'MyValue2' from dual union
  select 'MyValue3' from dual 
)
SELECT * 
FROM DatabaseTable  
WHERE Column in (
  select col1
  from  MyListOfValues);
0
répondu Gary_W 2016-02-05 19:26:45