PL/SQL - 在 Where In 子句中使用“列表”变量

Posted

技术标签:

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

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

SELECT * 
FROM DatabaseTable 
WHERE DatabaseTable.Field in MyListOfValues

我正在使用 Oracle SQL Developer

【问题讨论】:

据我所知,您不能这样做(至少在 Oracle 11 中不能)。我建议您构建一个动态查询并执行它。祝你好运。 How to load a large number of strings to match with oracle database?的可能重复 【参考方案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 块。谢谢

以上是关于PL/SQL - 在 Where In 子句中使用“列表”变量的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL - 如何在 IN 子句中使用数组

在 PL/SQL Developer 中使用了没有 Where 子句的更新语句

变量作为 Oracle PL/SQL 中 where 子句中的列名

oracle 形式:pl/sql 中 where 子句中的 max 子句

如何在 select 的 where 子句中替换 oracle pl/sql 变量

如何转换逗号分隔的 varchar 以用于 pl/sql 中的“IN”子句?