【YashanDB知识库】Oracle pipelined函数在YashanDB中的改写

简介: 【YashanDB知识库】Oracle pipelined函数在YashanDB中的改写

本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7802940.html?templateId=1718516
【问题分类】功能使用

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

相关文章
|
6月前
|
SQL 存储 关系型数据库
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
|
6月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】MySQL field 函数的改写方法
【YashanDB知识库】MySQL field 函数的改写方法
|
6月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
6月前
|
存储 关系型数据库 MySQL
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
本文介绍了MySQL中`CONTINUE HANDLER FOR NOT FOUND`的用法及其在YashanDB中的改写方法。通过一个示例存储过程,展示了如何使用游标和异常处理机制来应对“未找到数据”的情况。在MySQL中,`CONTINUE HANDLER`用于捕获此类异常;而在YashanDB中,则需改用游标的`%NOTFOUND`属性和`NO_DATA_FOUND`异常处理。文章对比了两者的执行效果,帮助用户顺利完成从MySQL到YashanDB的业务迁移。
|
6月前
|
SQL Oracle 关系型数据库
|
6月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】MySQL field 函数的改写方法
本文来自YashanDB官网,介绍将MySQL的FIELD函数改写到YashanDB的方法。MySQL中,FIELD函数用于自定义排序;而在YashanDB中,可使用DECODE或CASE语句实现类似功能。示例展示对表`t1`按指定顺序排序的过程,提供两种改写方式,结果均符合预期。
|
6月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
|
6月前
|
存储 关系型数据库 MySQL
【YashanDB知识库】MySQL返回结果集的存储过程的改写方法
本文介绍了将MySQL存储过程改写至YashanDB的解决方案。由于MySQL存储过程可直接返回结果集,而YashanDB需通过返回SYS_REF_CURSOR的函数实现类似功能,因此需要对代码进行转换。示例中展示了如何将MySQL存储过程`proc1`改写为YashanDB函数,并调整JDBC应用代码以适配REF_CURSOR输出参数,从而正确获取查询结果。此方法确保了跨数据库场景下的兼容性与功能性。
|
2月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
5月前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
1094 28

推荐镜像

更多