PLSQL流水线函数返回列表

Abs*_*ern 2 oracle plsql function pipelined-function

我正在尝试创建一个函数来从数据库中获取值列表。经过一些研究,我发现我需要使用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;
    /
Run Code Online (Sandbox Code Playgroud)

这些是我得到的错误:

[错误] 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语句中声明了变量。

如果有人可以帮助我,那就太好了!谢谢

Kau*_*yak 5

PIPE ROW可以为单行创建一个A ,而不是为游标的name变量创建一个,它包含整个记录集。

只需使用

PIPE ROW ( cur.value );

代替 PIPE ROW ( cur );

您也可以将查询输出存储到集合中,然后通过管道传递每个元素。

关于由于引起的错误W_ROW_COUNT,这是一个错字。您W_ROUNT_COUNT在添加时错误地使用了它。

演示版