Создать функцию PL SQL для возврата имени таблицы - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь создать функцию, которая возвращает табличное значение для вставки в другой запрос.

это функция, которую я хочу вернуть имя таблицы

create or replace PROCEDURE GET_TBL_NM (LYTID INTEGER)
AS 


BEGIN
    DECLARE
    CREATE OR REPLACE TYPE names_nt IS TABLE OF VARCHAR2 ( 1000 ); 
    exec select vw into :names_nt from io_layout_views where layout_id = LYTID;
  RETURN (names_nt);
END GET_TBL_NM;

, и это где я хочу вызвать функцию:

select * from TABLE(my_function(args));

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

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Вы создали procedure, который нельзя использовать для возврата значений непосредственно в запросе SELECT, как вы использовали.

Вам необходимо независимо создать UDT, который можно использовать в function (PL / SQL), а также в query (SQL) напрямую.

CREATE OR REPLACE TYPE NAMES_NT IS
    TABLE OF VARCHAR2(1000);
/

Функция, которую необходимо создать, должна возвращать вновь созданный тип следующим образом :

CREATE OR REPLACE FUNCTION GET_TBL_NM (
    LYTID INTEGER
) RETURN NAMES_NT AS
    NAMES_NT_VALS   NAMES_NT; -- newly created UDT
BEGIN
    SELECT
        VW
    BULK COLLECT -- need to use BULK COLLECT
    INTO NAMES_NT_VALS
    FROM
        IO_LAYOUT_VIEWS
    WHERE
        LAYOUT_ID = LYTID;

    RETURN NAMES_NT_VALS;
END GET_TBL_NM;
2 голосов
/ 31 марта 2020

Вы создали 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;
...