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