Ввод массива Oracle PL/SQL в параметр конвейерной функции

Я новичок в PL/SQL. Я создал конвейерную функцию внутри пакета, которая в качестве параметра принимает массив чисел (вложенная таблица).

Но у меня возникли проблемы при попытке запустить его через SQL-запрос. Пожалуйста, смотрите ниже

мой входной массив

 CREATE OR REPLACE TYPE num_array is TABLE of number;

объявление моей функции

CREATE OR REPLACE PACKAGE "my_pack" as
    TYPE myRecord is RECORD(column_a NUMBER);
    TYPE myTable IS TABLE of myRecord;

    FUNCTION My_Function(inp_param num_array) return myTable PIPELINED;

end my_pack;

мое определение функции

CREATE OR REPLACE PACKAGE BODY "my_pack" as

FUNCTION My_Function(inp_param num_array) return myTable PIPELINED as
        rec myRecord;
    BEGIN

        FOR i in 1..inp_param.count LOOP
            FOR e IN 
                (
                   SELECT column_a FROM  table_a where id=inp_param(i)

                )
                LOOP
                rec.column_a := e.column_a;

                PIPE ROW (rec); 

            END LOOP;
        END LOOP;

    RETURN;
END;

end my_pack;

Вот последний код, который я пробовал запустить с жабы. Но это не работает

declare
    myarray num_array;
    qrySQL varchar2(4000);
begin
    myarray := num_array(6341,6468);
    qrySQL := 'select * from TABLE(my_pack.My_Function(:myarray))';
    execute immediate qrySQL;
end;

Поэтому мой вопрос заключается в том, как я могу передать массив в эту конвейерную функцию из TOAD или SQL Developer. Пример был бы очень полезен.

Спасибо

1 ответ

Решение

Ошибка довольно очевидна, у вас есть переменная связывания, которой вы ничего не присвоили. Вам нужно передать ваш фактический массив с:

qrySQL := 'select * from TABLE(my_pack.My_Function(:myarray))';
execute immediate qrySQL using myarray;

Возможно, более полезно, если вы хотите вызвать его из PL/SQL, использовать статический SQL в качестве курсора:

set serveroutput on
declare
    myarray num_array;
begin
    myarray := num_array(6341,6468);
    for r in (select * from TABLE(my_pack.My_Function(myarray))) loop
      dbms_output.put_line(r.column_a);
    end loop;
end;
/

Или просто запросите статически как тест для фиксированных значений:

select * from TABLE(my_pack.My_Function(num_array(6341,6468)));

SQL Fiddle с некоторыми незначительными изменениями в функции для устранения ошибок, я думаю, пришел от редактирования к публикации.

Другие вопросы по тегам