Oracle PL/SQL-使用;列表“;Where in子句中的变量
在PL/SQL中,如何声明包含多个值(MyValue1、MyValue2等)的变量MyListFvaluesOracle PL/SQL-使用;列表“;Where in子句中的变量,oracle,plsql,Oracle,Plsql,在PL/SQL中,如何声明包含多个值(MyValue1、MyValue2等)的变量MyListFvalues 我正在使用Oracle SQL Developer创建如下SQL类型: CREATE TYPE MyListOfValuesType AS TABLE OF VARCHAR2(4000); 然后在SQL语句中使用它 DECLARE MyListOfValues MyListOfValuesType; BEGIN MyListOfValues := MyListOfValuesT
我正在使用Oracle SQL Developer创建如下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
表
类型,而不适用于PL/SQL表
类型。在Oracle12c中,您还可以使用PL/SQL类型。使用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);
使用集合:
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;
据我所知,您不能这样做(至少在Oracle 11中不能)。我建议您构建一个动态查询并执行它。祝你好运。作品可能重复;谢谢。如何还可以返回行计数?虽然游标中存在数据,但我得到的值为0。您使用的是过程/函数还是匿名PL/SQL块?匿名PL/SQL块。这只需要查询的特权,另一个解决方案创建一个类型。
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;