在PL / SQL中,如何声明包含多个值的变量MyListOfValues(MyValue1,MyValue2等)
SELECT *
FROM DatabaseTable
WHERE DatabaseTable.Field in MyListOfValues
我正在使用Oracle SQL Developer
答案 0 :(得分:5)
使用集合:
CREATE TYPE Varchar2TableType AS TABLE OF VARCHAR2(200);
或使用内置类型,例如SYS.ODCIVARCHAR2LIST
或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;
答案 1 :(得分:4)
像这样创建SQL类型:
CREATE TYPE MyListOfValuesType AS TABLE OF VARCHAR2(4000);
然后在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;
直到Oracle 11g,这仅适用于SQL TABLE
类型,而不适用于PL / SQL TABLE
类型。使用Oracle 12c,您还可以使用PL / SQL类型。
答案 2 :(得分:1)
如何使用基本构建临时表的WITH子句?不是真正的可重复使用。您可以使用数组,或者我认为加入查找表会更好。
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);