【问题类型】功能兼容性

【关键字】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_TABLE
PIPELINED AS
var_tmp     CLOB;
var_element CLOB;
n_length    NUMBER := LENGTH(var_split);
BEGIN
var_tmp := var_str;
WHILE INSTR(var_tmp, var_split) > 0 LOOP
var_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 IS
var_trt     T_RET_TABLE := T_RET_TABLE();
var_tmp     VARCHAR2(8000);
var_element VARCHAR2(8000);
n_length    NUMBER := LENGTH(var_split);
BEGIN
var_tmp := var_str;
WHILE INSTR(var_tmp, var_split) > 0 LOOP
var_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 语法支持,需手动改写

【迁移建议】
image.png


数据库砖家
1 声望0 粉丝