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.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;
【讨论】:
作品;谢谢。我怎样才能返回行数?尽管游标中存在数据,但我得到的值为 0。 您使用的是过程/函数还是匿名 PL/SQL 块? 匿名 PL/SQL 块。谢谢以上是关于PL/SQL - 在 Where In 子句中使用“列表”变量的主要内容,如果未能解决你的问题,请参考以下文章
在 PL/SQL Developer 中使用了没有 Where 子句的更新语句
变量作为 Oracle PL/SQL 中 where 子句中的列名
oracle 形式:pl/sql 中 where 子句中的 max 子句