Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL-使用;列表“;Where in子句中的变量_Oracle_Plsql - Fatal编程技术网

Oracle PL/SQL-使用;列表“;Where in子句中的变量

Oracle 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

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


我正在使用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;