为啥`SYS.odcivarchar2list`不能与`PIPELINED`函数一起使用
Posted
技术标签:
【中文标题】为啥`SYS.odcivarchar2list`不能与`PIPELINED`函数一起使用【英文标题】:Why `SYS.odcivarchar2list` not working with `PIPELINED` function为什么`SYS.odcivarchar2list`不能与`PIPELINED`函数一起使用 【发布时间】:2017-07-11 09:30:04 【问题描述】:当我尝试编译下面的代码时,我得到了错误:
[错误] PLS-00382 (15: 17): PLS-00382: 表达式类型错误
代码
CREATE OR REPLACE FUNCTION test_pipe
RETURN SYS.odcivarchar2list
PIPELINED
AS
CURSOR cEmploee
IS
SELECT first_name FROM employee;
BEGIN
FOR i IN cEmploee
LOOP
DBMS_OUTPUT.put_line (i.first_name);
PIPE ROW (sys.odcivarchar2list (i.first_name));
EXIT WHEN cEmploee%NOTFOUND;
END LOOP;
RETURN;
END;
/
谁能解释SYS.odcivarchar2list
是否适用于 PIPELINED 函数。让我知道如何解决这个问题。谢谢。
【问题讨论】:
PIPE ROW 需要记录类型,而sys.odcivarchar2list
是表类型(其他类型的行的表)。
【参考方案1】:
'var' 的类型应该是 varchar2:
CREATE OR REPLACE FUNCTION test_pipe
RETURN SYS.odcivarchar2list
PIPELINED
AS
CURSOR cEmploee
IS
SELECT first_name FROM employee;
var employee.first_name%type;
BEGIN
FOR i IN cEmploee
LOOP
DBMS_OUTPUT.put_line (i.first_name);
var := i.first_name;
PIPE ROW (var);
EXIT WHEN cEmploee%NOTFOUND;
END LOOP;
RETURN;
END;
/
select * from table(test_pipe)
【讨论】:
但为什么它不能与SYS.odcivarchar2list
一起使用。我知道使用varcahr2
应该可以。好的,我编辑我的问题以便更好地理解。
你没有返回列表@XING。您将逐行返回数据,作为 VARCHAR2,Oracle 知道如何将其转换为函数调用者的 ODCIVARCHAR2LIST。
@Ben。感谢您的回复。
Ben 说得对,这就是流水线函数的工作方式:一次返回一个集合的元素(例如:对象类型或 varchat2 的实例),而不是记录集。顺便说一句,如果您将一些日志记录放入函数中(dbms_output 可能不是最好的),您可以看到该函数在客户端获取数据时被调用。不执行一次以获得整个结果集。以上是关于为啥`SYS.odcivarchar2list`不能与`PIPELINED`函数一起使用的主要内容,如果未能解决你的问题,请参考以下文章