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

9avjhtql  于 2023-05-16  发布在  Oracle
关注(0)|答案(4)|浏览(215)

在PL/SQL中,如何声明包含多个值(MyValue 1、MyValue 2等)的变量MyListOfValues?

SELECT * 
FROM DatabaseTable 
WHERE DatabaseTable.Field in MyListOfValues

我正在使用Oracle SQL Developer

pxy2qtax

pxy2qtax1#

像这样创建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 11 g之前,这只适用于SQL TABLE类型,而不适用于PL/SQL TABLE类型。在Oracle 12 c中,您还可以使用PL/SQL类型。

zhte4eai

zhte4eai2#

使用集合:

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;
kcugc4gi

kcugc4gi3#

使用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);
vtwuwzda

vtwuwzda4#

SELECT     REGEXP_SUBSTR ('a,b,c,d,e,f,g,h', '[^,]+', 1, LEVEL) pivot_char
      FROM DUAL
CONNECT BY REGEXP_SUBSTR ('a,b,c,d,e,f,g,h', '[^,]+', 1, LEVEL) IS NOT NULL;

我从:
https://www.tek-tips.com/viewthread.cfm?qid=1639911

相关问题