PLSQL конвейерная функция для возврата списка - PullRequest
2 голосов
/ 08 марта 2019

Я пытаюсь создать функцию для получения списка значений из моей базы данных.После некоторых исследований я обнаружил, что мне нужно использовать функцию PIPELINE, и я нашел несколько примеров.Я выполнил свою функцию, но я как-то получил 2 ошибки, которые я не понимаю.

Вот мой код:

CREATE OR REPLACE TYPE LISTE_VALUES AS TABLE OF VARCHAR2(2000);
/    

CREATE OR REPLACE FUNCTION F_GET_VAL(
        PI_1 IN VARCHAR2,
        PI_2 IN NUMBER,
        PI_3 IN VARCHAR2)
    RETURN LISTE_VALUES PIPELINED

    IS
        W_ROW_COUNT NUMBER := 0;

    BEGIN

        FOR CUR IN (SELECT VALUE FROM TABLE 
                    WHERE ...
                      ...

                    )

        LOOP
            PIPE ROW (CUR);
            W_ROUNT_COUNT := W_ROW_COUNT + 1;
        END LOOP;

        DBMS_OUTPUT.PUT_LINE('There were '
                            || W_ROW_COUNT
                            || ' rows selected' );

    END F_GET_VAL;
    /

И вот такие ошибки я получаю:

[Ошибка] PLS-00382: PLS-00382: выражение имеет неправильный тип (в строке: PIPE ROW (CUR);)

[Ошибка] PLS-00201: PLS-00201: идентификатор 'W_ROUNT_COUNT 'должен быть объявлен

(в строке: W_ROUNT_COUNT: = W_ROW_COUNT + 1;)

Для первой ошибки, которую я трижды проверил, и VALUE в моей таблице имеет типVARCHAR2(2000), точно так же, как я объявил свой тип в начале (таблица VARCHAR2(2000)).

И, во-вторых, я не понимаю, потому что я объявил переменную W_ROW_COUNT в своем операторе IS.

Если бы кто-то мог мне помочь, было бы здорово!Спасибо

1 Ответ

5 голосов
/ 08 марта 2019

A PIPE ROW можно создать для одной строки, а не для переменной имени курсора, которая содержит весь набор записей.

Просто используйте

PIPE ROW ( cur.value );

вместо PIPE ROW ( cur );

Вы также можете сохранить выходные данные запроса в коллекцию и затем направить каждый элемент.

Что касается ошибки из-за W_ROW_COUNT, этоопечатка.Вы ошибочно использовали его как W_ROUNT_COUNT при добавлении.

Демо

...