写点什么

Oracle pipelined 函数在 YashanDB 中的改写

作者:YashanDB
  • 2024-12-20
    广东
  • 本文字数:982 字

    阅读完需:约 3 分钟

【问题分类】功能使用

【关键字】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

发布于: 刚刚阅读数: 2
用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
Oracle pipelined函数在YashanDB中的改写_数据库_YashanDB_InfoQ写作社区