oracle plsql

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;