Вы создали Procedure
со многими синтаксическими ошибками. Вам нужно создать Function
, как показано ниже, если вы хотите Return
значения из него. Попробуйте это:
Тип и таблицы
CREATE OR REPLACE TYPE names_nt IS TABLE OF VARCHAR2 ( 1000 );
Create table io_layout_views (vw varchar2(1000),layout_id number);
insert into io_layout_views values ('AA',1);
insert into io_layout_views values ('BB',1);
- Функция
CREATE OR REPLACE FUNCTION get_tbl_nm (
lytid INTEGER
) RETURN names_nt AS
v_var names_nt := names_nt ();
BEGIN
SELECT vw BULK COLLECT INTO
v_var
FROM io_layout_views
WHERE layout_id = lytid;
return(v_var);
END get_tbl_nm;
Выполнение:
select * from TABLE(get_tbl_nm(1));
Также необходимо учитывать, что при вы играете с Table
функциями, есть вероятность получения проблем с производительностью, если коллекция относительно велика. Поскольку коллекция большая, результат не будет отображаться до тех пор, пока не будет заполнена полная коллекция. Чтобы избежать этого, мы используем функцию PIPELINED
, как показано ниже. Эта функция вернет результат, как только он станет доступным для коллекции.
Конвейерная функция: Подробнее ЗДЕСЬ
CREATE OR REPLACE FUNCTION get_tbl_nm (lytid INTEGER)
RETURN names_nt PIPELINED
AS
v_var names_nt := names_nt ();
BEGIN
FOR i IN (
SELECT vw
FROM io_layout_views
WHERE layout_id = lytid
)
LOOP
PIPE ROW ( i.vw ); -- Building the resultset
END LOOP;
RETURN;
END get_tbl_nm;