Oracle pipelined函数在YashanDB中的改写
【问题分类】功能使用
【关键字】pipelined
【问题描述】
Oracle PL/SQL中包含pipelined函数的对象迁移到YashanDB会出现不兼容现象。
【问题原因分析】
Pipelined函数是一种特殊的表函数,以流方式返回结果,这样可以边处理数据边返回结果,提高性能。嵌套表是一组同类型的元素的集合,适用于存储分组结果或批量处理数据时,可以在 PL/SQL 中遍历和操作这些数据。YashanDB 不支持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, length(var_tmp)); 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; var_tmp varchar2(8000); var_element varchar2(8000); n_length Number := length(var_split); begin var_trt := t_ret_table(); 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, length(var_tmp)); 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; / |
【影响范围】23.2.10.100及以下版本
【修复版本】23.2.10.100