如何实现流水线函数_PIPELINED关键字与PIPE ROW应用
PIPE ROW 在 Oracle PL/SQL 中怎么写才不报错直接说结论pipe row 只能在定义为 pipelined 的函数里用且函数返回类型必须是已声明的集合类型比如 table of number不能是 ref cursor 或标量。常见错误现象调用时抛 ORA-06553: PLS-382: expression is of wrong type或者 ORA-06553: PLS-306: wrong number or types of arguments —— 大多因为返回类型没对上、忘了加 PIPELINED或在普通函数里硬塞了 PIPE ROW。函数头必须显式写 RETURN ... PIPELINED不能只在 body 里用 PIPE ROW返回集合类型需提前用 CREATE OR REPLACE TYPE 建好不能用匿名嵌套表如 RETURN SYS.ODCIVARCHAR2LIST 是特例但不推荐依赖PIPE ROW 每次只能传一个元素类型必须和集合元素类型完全一致包括精度、字符集、NULL 性函数体内不能有 RETURN除了最后的 END RETURN否则会提前退出后续 PIPE ROW 不执行示例安全写法CREATE OR REPLACE TYPE num_list AS TABLE OF NUMBER;CREATE OR REPLACE FUNCTION gen_nums(n IN NUMBER) RETURN num_list PIPELINED ISBEGIN FOR i IN 1..n LOOP PIPE ROW(i); -- 类型匹配num_list 元素是 NUMBERi 是 NUMBER END LOOP; RETURN; -- 必须有但不带值END;为什么用 PIPELINED 而不是普通函数返回集合核心区别在执行模型PIPELINED 函数是“边算边吐”调用方比如 SQL 查询可以逐行消费结果普通函数得等全部计算完、构造好整个集合再一次性返回内存和延迟都高。典型使用场景处理大结果集但下游只取前几行SELECT * FROM TABLE(gen_nums(1000000)) WHERE ROWNUM 或需要流式 join / filter 的 ETL 场景。非 pipelined 函数Oracle 会把整个集合加载进 PGA100 万行 NUMBER 可能占几十 MB 内存Pipelined 函数每调一次 PIPE ROW就向调用方送一行PGA 压力恒定常驻约 1–2 行缓冲兼容性注意10g 支持但 9i 不支持如果函数被物化视图引用部分版本要求必须 DETERMINISTIC而 pipelined 函数通常不满足TABLE(gen_nums(...)) 在 SQL 里怎么避免 ORA-22905 错误ORA-22905: cannot access rows from a non-nested table item 是最常卡住人的点 —— 根本原因你用了 TABLE()但 Oracle 没法确认这个函数返回的是合法嵌套表类型。 Zeemo AI 一款专业的视频字幕制作和视频处理工具
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2522481.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!