Используйте переменную Array (Out from Execute Immediate) в операторе Select в процедуре хранилища - PullRequest
0 голосов
/ 08 февраля 2019

Мне нужно использовать переменную массива (вне выполнения немедленно) в качестве параметра в операторе выбора в процедуре хранения.

Создать новый тип как переменную (как код ниже)

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

ТогдаСоздайте мою процедуру, которая возвращает таблицу

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

Может кто-нибудь помочь мне!

1 Ответ

0 голосов
/ 08 февраля 2019

Существует небольшая проблема в использовании типа коллекции в предложении SQL IN.Использование типа коллекции непосредственно в предложении IN не поддерживается.Типы коллекций должны быть TABLE d для использования в SQL.

Вот небольшая модификация, которая компилируется и выполняется нормально:

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.

Затем она будет выполняться нормально:

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


PL/SQL procedure successfully completed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...