return 列表的 PLSQL 流水线函数
PLSQL pipelined function to return a list
我正在尝试创建一个函数来从我的数据库中获取值列表。经过一些研究,我发现我需要使用 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;
/
这些是我得到的错误:
[Error] PLS-00382 : PLS-00382: expression is of wrong type (at the
line : PIPE ROW (CUR);)
[Error] PLS-00201 : PLS-00201: identifier 'W_ROUNT_COUNT' must be
declared
(at the line : W_ROUNT_COUNT := W_ROW_COUNT + 1;)
对于第一个错误,我进行了三重检查,我的 table 中的 VALUE
具有类型 VARCHAR2(2000)
,与我在开头声明的类型完全相同(table VARCHAR2(2000)
).
第二个,我不明白,因为我在 IS 语句中声明了变量 W_ROW_COUNT
。
如果有人能帮助我,那就太好了!
谢谢
可以为单行而不是包含整个记录集的游标名称变量创建 PIPE ROW
。
只需使用
PIPE ROW ( cur.value );
而不是PIPE ROW ( cur );
您还可以将查询输出存储到一个集合中,然后通过管道传输每个元素。
关于W_ROW_COUNT
的错误,是错字。您在添加时错误地将其用作 W_ROUNT_COUNT
。
我正在尝试创建一个函数来从我的数据库中获取值列表。经过一些研究,我发现我需要使用 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;
/
这些是我得到的错误:
[Error] PLS-00382 : PLS-00382: expression is of wrong type (at the line : PIPE ROW (CUR);)
[Error] PLS-00201 : PLS-00201: identifier 'W_ROUNT_COUNT' must be declared
(at the line : W_ROUNT_COUNT := W_ROW_COUNT + 1;)
对于第一个错误,我进行了三重检查,我的 table 中的 VALUE
具有类型 VARCHAR2(2000)
,与我在开头声明的类型完全相同(table VARCHAR2(2000)
).
第二个,我不明白,因为我在 IS 语句中声明了变量 W_ROW_COUNT
。
如果有人能帮助我,那就太好了! 谢谢
可以为单行而不是包含整个记录集的游标名称变量创建 PIPE ROW
。
只需使用
PIPE ROW ( cur.value );
而不是PIPE ROW ( cur );
您还可以将查询输出存储到一个集合中,然后通过管道传输每个元素。
关于W_ROW_COUNT
的错误,是错字。您在添加时错误地将其用作 W_ROUNT_COUNT
。