为啥`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`函数一起使用的主要内容,如果未能解决你的问题,请参考以下文章

你应该同步运行方法吗?为啥或者为啥不?

为啥需要softmax函数?为啥不简单归一化?

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

gprof 适合分析长时间运行的程序吗?为啥或者为啥不?

为啥每次都加载新的 xib 文件?为啥不替换前一个?

在执行语义分割任务时我应该减去图像均值吗?为啥或者为啥不?