【问题标题】:How can I collect multiple values into an array and later use the array with IN clause如何将多个值收集到一个数组中,然后在 IN 子句中使用该数组
【发布时间】:2014-08-21 21:44:12
【问题描述】:

我需要在 Oracle 10g/11g 的存储过程中执行此操作:

SELECT COLUM1 INTO SOME_ARRAY FROM TAB1 WHERE COLUMN2=P_COL2;

然后我希望能够在另一个带有 IN 子句的查询中使用 SOME_ARRAY,如下所示:

SELECT * FROM TAB2 WHERE TAB2.COLUMN1 IN SOME_ARRAY

这可能不需要创建类型吗?也许是一个动态数组?一点代码将不胜感激。

【问题讨论】:

  • TYPE 是您要寻找的动态数组!还是只是一个子查询?
  • 子查询是指SELECT * FROM TAB2 WHERE TAB2.COLUMN1 IN (SELECT COLUM1 FROM TAB1 WHERE COLUMN2=P_COL2)?如果是这样,我不喜欢那样。那你能告诉我我会怎么走TYPE吗?
  • 可能不可能,您会遇到 PLS-00642 错误,请参阅dba-oracle.com/…

标签: arrays oracle stored-procedures in-clause


【解决方案1】:

让我们创建一个类型作为 Oracle 对象,以供 PL/SQLSQL 引用

CREATE TYPE SOME_ARRAY_REC AS OBJECT
(
   COLUM1 VARCHAR2(100)
);
/

现在,我们在上面创建的类型为nested table 的 DB 对象

CREATE TYPE SOME_ARRAY_TAB AS TABLE OF SOME_ARRAY_REC;
/

PL/SQL

DECLARE
      PL_ARRAY_REC TAB1%ROWTYPE;
      TYPE PL_ARRAY_TAB IS TABLE OF PL_ARRAY_REC  
                INDEX BY PLS_INTEGER;

      v_PL_ARRAY PL_ARRAY_TAB;

      v_ARRAY SOME_ARRAY_TAB := SOME_ARRAY_TAB();
BEGIN
      /* Bulk collect the records into local PL/SQL type */
      SELECT COLUM1 
      BULK COLLECT INTO v_PL_ARRAY
      FROM TAB1 WHERE COLUMN2=P_COL2;

      /* To use it in SQL we have to use a SQL compatible Type*/
      /* So copy the contents from local type to SQL compatible type */
      FOR I IN 1..v_PL_ARRAY.COUNT
      LOOP
           v_ARRAY.EXTEND;
           v_ARRAY(I) := SOME_ARRAY_REC(v_PL_ARRAY(I).COLUM1);
      END LOOP;

      /* Use TABLE() to cast the SQL compatible Nested table as normal table */
      SELECT * BULK COLLECT INTO SOME_VARRAY 
      FROM TAB2
      WHERE COLUMN1 IN (SELECT COLUM1 FROM TABLE(v_ARRAY));

END;
/

PS:我更喜欢 SubQuery

【讨论】:

  • 我知道,我也会,但是当我使用子查询时,它需要永恒的时间才能完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多