oracle - PL/SQL-Use la variable "Lista" en la cláusula Where
plsql (3)
En PL / SQL, ¿cómo declaro la variable MyListOfValues que contiene múltiples valores (MyValue1, MyValue2, etc.)
SELECT *
FROM DatabaseTable
WHERE DatabaseTable.Field in MyListOfValues
Estoy usando Oracle SQL Developer
¿Qué tal usar una cláusula WITH que básicamente construye una tabla temporal? No es realmente reutilizable. Podría usar una matriz o yo diría que unirse a una tabla de búsqueda sería mejor.
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);
Cree el tipo SQL de esta manera:
CREATE TYPE MyListOfValuesType AS TABLE OF VARCHAR2(4000);
Y luego úsalo en una declaración 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;
Hasta Oracle 11g, esto solo funciona con un tipo
TABLE
SQL, no con un tipo
TABLE
PL / SQL.
Con Oracle 12c, también puede usar los tipos PL / SQL.
Usa una colección:
CREATE TYPE Varchar2TableType AS TABLE OF VARCHAR2(200);
O use un tipo
SYS.ODCIVARCHAR2LIST
como
SYS.ODCIVARCHAR2LIST
o
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;