PL/SQL - 在Where子句中使用"List"变量

Bob*_*ith 4 oracle plsql

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

SELECT * 
FROM DatabaseTable 
WHERE DatabaseTable.Field in MyListOfValues
Run Code Online (Sandbox Code Playgroud)

我正在使用Oracle SQL Developer

Luk*_*der 5

像这样创建 SQL 类型:

CREATE TYPE MyListOfValuesType AS TABLE OF VARCHAR2(4000);
Run Code Online (Sandbox Code Playgroud)

然后在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;
Run Code Online (Sandbox Code Playgroud)

直到 Oracle 11g,这仅适用于 SQLTABLE类型,不适用于 PL/SQLTABLE类型。在 Oracle 12c 中,您还可以使用 PL/SQL 类型。


MT0*_*MT0 5

使用集合:

CREATE TYPE Varchar2TableType AS TABLE OF VARCHAR2(200);
Run Code Online (Sandbox Code Playgroud)

或使用内置类型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;
Run Code Online (Sandbox Code Playgroud)