Oracle 在store procedurce的Select语句中使用数组变量(从Execute Immediate中输出)

Oracle 在store procedurce的Select语句中使用数组变量(从Execute Immediate中输出),oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我需要在存储过程中的Select语句中使用数组变量(out from Execute Immediate)作为参数 将新类型创建为Varray(如下代码所示) 然后创建返回表的过程 CREATE OR REPLACE PROCEDURE SchemaName.ProcedureName (Query_String IN VARCHAR2, Ref_Cursor OUT SYS_REFCURSOR) AS BEGIN DECLARE COMCODE Array_LIST; BEGIN

我需要在存储过程中的Select语句中使用数组变量(out from Execute Immediate)作为参数

将新类型创建为Varray(如下代码所示)

然后创建返回表的过程

CREATE OR REPLACE PROCEDURE SchemaName.ProcedureName
(Query_String IN VARCHAR2, Ref_Cursor OUT SYS_REFCURSOR)

AS
BEGIN
DECLARE COMCODE Array_LIST;

    BEGIN
        EXECUTE IMMEDIATE Query_String BULK COLLECT INTO COMCODE;

            BEGIN
                    Open Ref_Cursor For

                        SELECT
                             Column1, Column2
                        From Table_Name
                        Where
                            Column1 IN (COMCODE);
            END;
    END;
END;
当我执行这个过程时,我得到了下面的错误

==> ORA-00932: inconsistent datatypes : expected NUMBER got Scheman_Name.Array_LIST

谁能帮帮我

在子句中的SQL
in中使用集合类型只存在一个小问题。不支持在
子句中直接在
中使用集合类型。集合类型必须是
TABLE
d才能在SQL中使用

这里有一个编译和执行ok的小修改:

CREATE TABLE TABLE_NAME(COLUMN1 VARCHAR2(32), COLUMN2 VARCHAR2(32));

CREATE OR REPLACE TYPE Array_LIST AS VARRAY(200) OF VARCHAR2(10);

CREATE OR REPLACE PROCEDURE ProcedureName
(Query_String IN VARCHAR2, Ref_Cursor OUT SYS_REFCURSOR)

AS
BEGIN
  DECLARE COMCODE Array_LIST;

  BEGIN
    EXECUTE IMMEDIATE Query_String BULK COLLECT INTO COMCODE;

    BEGIN
      Open Ref_Cursor For

        SELECT
          Column1, Column2
        From Table_Name
        Where
            Column1 IN (SELECT COLUMN_VALUE FROM TABLE(COMCODE));
    END;
  END;
END;
/

Procedure created.
然后它将执行ok:

DECLARE
V_CURSOR SYS_REFCURSOR;
BEGIN
  PROCEDURENAME(Q'!SELECT 'LOREM IPSUM' FROM DUAL!',V_CURSOR);
END;
/


PL/SQL procedure successfully completed.
DECLARE
V_CURSOR SYS_REFCURSOR;
BEGIN
  PROCEDURENAME(Q'!SELECT 'LOREM IPSUM' FROM DUAL!',V_CURSOR);
END;
/


PL/SQL procedure successfully completed.