【问题标题】:PLSQL pipelined function to return a listPLSQL流水线函数返回一个列表
【发布时间】:2019-07-30 13:53:16
【问题描述】:

我正在尝试创建一个函数来从我的数据库中获取值列表。经过一些研究,我发现我需要使用 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:表达式类型错误(在 行:管道行(CUR);)

[错误] PLS-00201:PLS-00201:标识符“W_ROUNT_COUNT”必须是 声明

(在该行:W_ROUNT_COUNT := W_ROW_COUNT + 1;)

对于第一个错误,我检查了三次,我的表中的 VALUE 有一个类型 VARCHAR2(2000),与我在开头声明的类型完全相同(VARCHAR2(2000) 的表)。

第二个,我不明白,因为我在 IS 语句中声明了变量 W_ROW_COUNT

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

【问题讨论】:

    标签: oracle function plsql pipelined-function


    【解决方案1】:

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

    随便用

    PIPE ROW ( cur.value );

    而不是PIPE ROW ( cur );

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

    关于W_ROW_COUNT的错误,是一个错字。您在添加时错误地将其用作W_ROUNT_COUNT

    Demo

    【讨论】:

    • 非常感谢您的明确回答,它现在完全可以工作了 :) 我对第二个错误很不好......没看到!
    • 注意cur这里是记录变量,不是游标。
    • @JeffreyKemp :谢谢,我希望我现在措辞恰当。
    猜你喜欢
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多