PL / SQL - 使用" List"在条款中的变量

时间:2016-02-05 19:13:58

标签: oracle plsql

在PL / SQL中,如何声明包含多个值的变量MyListOfValues(MyValue1,MyValue2等)

SELECT * 
FROM DatabaseTable 
WHERE DatabaseTable.Field in MyListOfValues

我正在使用Oracle SQL Developer

3 个答案:

答案 0 :(得分:5)

使用集合:

CREATE TYPE Varchar2TableType AS TABLE OF VARCHAR2(200);

或使用内置类型,例如SYS.ODCIVARCHAR2LISTSYS.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);