写点什么

YashanDB|Oracle 中的 pipelined 表函数迁移不过? 这样改写就对了

作者:数据库砖家
  • 2025-05-13
    广东
  • 本文字数:992 字

    阅读完需:约 3 分钟

【问题类型】功能兼容性

【关键字】PL/SQL、pipelined 函数、嵌套表、表函数

【问题描述】

Oracle 的 pipelined 函数在 PL/SQL 中被广泛使用,尤其适合处理字符串分割、流式计算等场景。但在将这类函数迁移至 YashanDB 时,会出现语法不兼容或执行失败的问题。

【根因分析】

pipelined 是 Oracle 提供的一种表函数增强机制,允许函数边计算边返回结果集,典型特征是使用 PIPE ROW(...) 语句。

而 YashanDB 当前 不支持 PIPELINED 函数结构,因此 Oracle 中涉及 PIPE ROW、PIPELINED 关键字的函数在迁移时需要重构。

【解决思路】

可以通过 嵌套表类型 + 标准集合扩展写法 来模拟 pipelined 效果。

【Oracle 原始函数示例】

CREATE OR REPLACE TYPE T_RET_TABLE IS TABLE OF VARCHAR2 (4000);/CREATE OR REPLACE FUNCTION ROW_SPLIT (var_str IN STRING, var_split IN STRING)RETURN T_RET_TABLEPIPELINED ASvar_tmp     CLOB;var_element CLOB;n_length    NUMBER := LENGTH(var_split);BEGINvar_tmp := var_str;WHILE INSTR(var_tmp, var_split) > 0 LOOPvar_element := SUBSTR(var_tmp, 1. INSTR(var_tmp, var_split) - 1);var_tmp := SUBSTR(var_tmp, INSTR(var_tmp, var_split) + n_length);PIPE ROW(var_element);END LOOP;PIPE ROW(var_tmp);RETURN;END row_split;/--YashanDB 改写参考CREATE OR REPLACE TYPE T_RET_TABLE IS TABLE OF VARCHAR2 (4000);/CREATE OR REPLACE FUNCTION ROW_SPLIT (var_str IN VARCHAR, var_split IN VARCHAR)RETURN T_RET_TABLE ISvar_trt     T_RET_TABLE := T_RET_TABLE();var_tmp     VARCHAR2(8000);var_element VARCHAR2(8000);n_length    NUMBER := LENGTH(var_split);BEGINvar_tmp := var_str;WHILE INSTR(var_tmp, var_split) > 0 LOOPvar_element := SUBSTR(var_tmp, 1. INSTR(var_tmp, var_split) - 1);var_tmp := SUBSTR(var_tmp, INSTR(var_tmp, var_split) + n_length);var_trt.EXTEND(1);var_trt(var_trt.COUNT) := var_element;END LOOP;var_trt.EXTEND(1);var_trt(var_trt.COUNT) := var_tmp;RETURN var_trt;END row_split;/
复制代码

【适用场景】

字符串按分隔符拆分成多行

自定义函数返回集合

迁移基于 pipelined 实现的 Oracle 表函数逻辑

【适用版本】

受影响版本:YashanDB 23.2.10.100 及以下

修复情况:暂无 pipelined 语法支持,需手动改写

【迁移建议】


用户头像

还未添加个人签名 2025-04-09 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB|Oracle 中的 pipelined 表函数迁移不过?这样改写就对了_数据库_数据库砖家_InfoQ写作社区