【问题标题】:PL/SQL - Use "List" Variable in Where In ClausePL/SQL - 在 Where In 子句中使用“列表”变量
【发布时间】:2016-05-15 21:06:09
【问题描述】:

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

SELECT * 
FROM DatabaseTable 
WHERE DatabaseTable.Field in MyListOfValues

我正在使用 Oracle SQL Developer

【问题讨论】:

标签: oracle plsql


【解决方案1】:

像这样创建 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】:

    如何使用基本上构建临时表的 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);
    

    【讨论】:

    • 这只需要查询的权限,其他解决方案创建一个类型。
    【解决方案3】:

    使用集合:

    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;
    

    【讨论】:

    • 作品;谢谢。我怎样才能返回行数?尽管游标中存在数据,但我得到的值为 0。
    • 您使用的是过程/函数还是匿名 PL/SQL 块?
    • 匿名 PL/SQL 块。谢谢
    猜你喜欢
    • 2020-04-16
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多