oracle存储过程转mysql存储过程_oracle存储过程返回结果集

oracle存储过程转mysql存储过程_oracle存储过程返回结果集达梦存储过程的语法与oracle的高度相似,但有好多细节还是有差异。我在这次项目迁移中踩过不少小坑,在这里给大家分享一下。 说明一下,我用的版本是达梦8,迁移时碰到的问题有些我已经反馈给达梦的官方群管

oracle存储过程转达梦8存储过程时踩过的坑

达梦存储过程的语法与oracle的高度相似,但有好多细节还是有差异。我在这次项目迁移中踩过不少小坑,在这里给大家分享一下。

说明一下,我用的版本是达梦8,迁移时碰到的问题有些我已经反馈给达梦的官方群管理员,估计以后会有修复。

rpad问题

达梦的rpad函数,计算中文时永远是认为一个中文字符中两个字节,即使数据库设置的字符集是utf8(目前就发现rpad/lpad函数有这个问题,其它字符串函数都能正确识别,当字符集是utf8时能识别出来一个字符中3个字节)

测试代码:

select rpad("我是hch", 6), lengthb("我是hch") from dual -- 达梦输出"我是hc 9"
union all
select rpad("我是hch", 5), length("我是hch") from dual -- 达梦输出"我是h 5" 
union all
select rpad("我是hch", 3), length("我是hch") from dual; -- 达梦输出"我 5"

代码100分

这个问题达梦的工作人员说以后会修复,目前我的解决方法是自己写一个rpad函数

代码100分 function rpad_dm(string varchar2, padded_length number, pad_string varchar2 := " ")
    return varchar2 IS
    v_len number := lengthb(string);
  BEGIN
  	    dbms_output.put_line("v_len - padded_length = " );
  	if padded_length < v_len THEN
  		return substrb(string, 1, padded_length); --如果输入长度小于原字符串长度,则调用substrb截断
  	elsif padded_length = v_len THEN
  		return string; --如果长度相等直接返回原串即可
  	else
  		return string || rpad(" ", padded_length - v_len, pad_string); --如果长度大于原字符串,则在后面补空格
  	end if;
  END;

短路问题

一般编程语言都会提供短路功能,在计算与或逻辑时,如果前半段逻辑已经能确定真假时,后半段逻辑不会执行。

plsql里面也实现了短路功能,我们一般会利用这个特性减少一些代码,例如先判断变量是否为空,如果不为空再使用变量做运算:

if (var is not null and va.exists(“error”) ) then dbms_output.put_line(“yes”); fi;

但在达梦的存储过程,短路却没有实现。上面的代码不管var是否为空,都会进行va.exists(“error”)这个逻辑。如果不幸var的变量是空的,就会导致运行异常。

测试代码1:

dbms_output.enable;
declare
  v_flag boolean;
begin
  -- 请问这个存储过程执行异常,报"非法的参数数据"  是不是达梦的bug oracle下是可以正常运行的
  -- 还是有什么设置可以让存储过程正常执行
  if  (to_number("1") != 1) and to_number("abc") = 1 then
    dbms_output.put_line("yes");
  end if;
  dbms_output.put_line("ok");
end;

测试代码2:

代码100分dbms_output.enable;
declare
       TYPE TEST_RPT_LIST IS TABLE OF number INDEX BY PLS_INTEGER;
       o_demo_list TEST_RPT_LIST;
       i_report_id number := 17410491;
BEGIN
  -- 验证达梦8 if短路
  select 1 BULK COLLECT INTO o_demo_list from dual;
  dbms_output.put_line("o_demo_list(1) = " || o_demo_list(1));


  if o_demo_list(1) = 1 or o_demo_list(2) = 2 THEN -- or 短路没问题
  	dbms_output.put_line("or yes"); -- or yes能正常输出
  end if;

  if o_demo_list(1) != 1 and o_demo_list(2) = 2 THEN -- o_demo_list(1) != 1 不成立  为什么还要执行o_demo_list(2) = 2判断
    dbms_output.put_line("and yes"); -- 这里永远不应该输出
  end if;

  dbms_output.put_line("done"); -- 走不到done
EXCEPTION
  WHEN no_data_found THEN
     dbms_output.put_line("no_data_found tbl_demo_tab " || "ID " || to_char(i_report_id));
  WHEN OTHERS THEN
    -- RAISE;
    dbms_output.put_line("err:" || sqlcode || sqlerrm);
END;

不只是if有短路问题,decode,case when等类似的都会有短路问题。

“case 判断 when 表达式1 else 表达式2 end” 在oracle是如果条件成立则执行条件1并返回其值,而在达梦是同时执行表达式1和表达式2,并根据判断结果返回一个值。

解决方法是不要偷懒,不依赖短路实现,多写几个if判断,或者把decode拆成多个if else语句。

深浅拷贝问题

oracle的table数组变量的赋值,默认是值复制(即深拷贝),而达梦默认是引用复制(即浅拷贝)。

也就是说在oracle使用 tmpArr := arr (tmpArr 和arr 都是数组),然后对这个tmpArr操作,不会影响arr的值,而在达梦,修改tmpArr数组元素的内容就是在修改arr

测试代码

        FOR vv IN 1 .. 5 -- crontab 初始化赋值
        LOOP                
                CASE vv
                WHEN 1 THEN
                        v_obj.minutes := tmpArr;
                WHEN 2 THEN
                        v_obj.hours := tmpArr;
                WHEN 3 THEN
                        v_obj.days := tmpArr;
                WHEN 4 THEN
                        v_obj.months := tmpArr;
                WHEN 5 THEN
                        v_obj.weeks := tmpArr;
                END CASE;
        END LOOP;

在oracle对v_obj这样赋值后,v_obj.minutes和v_obj.hours是两个不同的变量,分别对两个变量修改,相互之间不会出现干扰。而在达梦8,v_obj下面所有变量都指向同一个数组,对v_obj任意一个成员修改,都会同时影响其它成员的值。

解决方法是自己写一个数组拷贝函数,例如这样:

function copy1kList(v_input t_str_list) return t_str_list IS
    v_tmplist t_str_list;
    v_ind PLS_INTEGER;
  begin
    --TYPE t_str_list  IS TABLE OF VARCHAR2(1024) INDEX BY PLS_INTEGER;
  	if v_input.count > 0 then
  		/*
  		//在v_input里面的元素不连续时,这样会有bug
  		for vv in v_input.first .. v_input.last LOOP
  			v_tmplist(vv) := v_input(vv);
  		end loop;
  		*/
  		v_ind = v_input.first;
  		while v_ind is not null
  		loop
  			v_tmplist(v_ind) := v_input(v_ind);
  			v_ind = v_input.next(v_ind);
  		end loop;
  	end if;
  	return v_tmplist;
  end;

使用这个函数代替数组变量赋值就能维持代码行为与oracle一致。

今天暂时先分享这三个问题,后面有时间再整理其它坑。这些坑比较隐蔽,花了我不少时间调试才发现,我把它们总结出来,希望能对你有所帮助。

oracle存储过程转mysql存储过程_oracle存储过程返回结果集

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7079.html

(0)
上一篇 2023-03-27
下一篇 2023-03-27

相关推荐

  • Oracle通过一个字段的值将一条记录拆分为多条记录「建议收藏」

    Oracle通过一个字段的值将一条记录拆分为多条记录「建议收藏」前言 之前遇到了一次这样的需求,当时没有记录,这一次又赶上了,简单的记录一下。 本文个人拙见,若有出入,请指出——来自菜的颤抖 该方式的效率不高,如何优化,请看记Oracle中regexp_subs…

    2023-01-28
    147
  • centos7安装oracle10g教程_centos安装图形oracle11g

    centos7安装oracle10g教程_centos安装图形oracle11gCentos 7 安装 Oracle 12cR2 流程 一个欠登儿程序员 2019-01-28 16:40:30 788 收藏 2 分类专栏: Centos 7 软件安装系列 版权 前言 在公司之前…

    2023-03-20
    130
  • Python merge函数解析

    Python merge函数解析在现代的大数据时代,数据的处理已经成为了程序员最重要的工作之一。数据处理中排序是一个非常重要的话题。在Python中,使用内置函数codesorted/code可以对数据进行排序,而merge功能则是将两个有序的数组合并成一个有序的数组。在这篇文章中,我们将介绍Python中的codemerge/code函数,并探究他的优化。

    2024-06-26
    46
  • 安装Python中的numpy库

    安装Python中的numpy库Numpy是Python中一个强大的科学计算库。它提供了高效的数组操作、线性代数、FFT等功能。Numpy是大多数Python科学计算软件的基础,包括Pandas、SciPy等数据处理和科学计算包。在本文中,我们将讨论如何安装Python中的numpy库。

    2024-07-20
    30
  • [Redis] Redis6 的RC版本更改日志「建议收藏」

    [Redis] Redis6 的RC版本更改日志「建议收藏」Redis 6在许多关键方面对Redis进行了改进,并且是该项目历史上最大的Redis版本之一,因此,这里我们仅列出此版本中的最大功能: *模块系统现在具有许多新的API这使得模块作者可以完成过去无法

    2023-02-16
    157
  • 《阿里巴巴Java开发手册》码出高效详解(一)- 为什么要学习阿里编码手册「建议收藏」

    《阿里巴巴Java开发手册》码出高效详解(一)- 为什么要学习阿里编码手册「建议收藏」《Java 开发手册》(以下简称《手册》)是每个 Java 工程师人手必备的一本参考指南。该手册包括 编程规约、异常日志、单元测试、安全规约、MySQL 数据库、工程结构、设计规约 7 个部分 ,涵盖

    2023-01-25
    137
  • 一文详解TDSQL PG版Oracle兼容性实践[通俗易懂]

    一文详解TDSQL PG版Oracle兼容性实践[通俗易懂]TDSQL PG版分布式关系型数据库,是一款同时面向在线事务交易和MPP实时数据分析的高性能HTAP数据库系统。面对应用业务产生的不定性数据爆炸需求,不管是高并发交易还是海量实时数据分析,TDSQL

    2023-05-02
    131
  • Python Future概述

    Python Future概述Python语言自问世以来,一直得到了广泛的应用和支持,其在多种领域和行业中都有着重要的地位。而这个支持和应用的趋势还在不断加强,我们能够看到许多的技术、工具、框架、语法等等,都在不断的壮大和完善。在这篇文章中,我们将探讨Python的未来发展趋势,了解在众多的技术中,Python将如何持续的发展和壮大。

    2024-05-22
    57

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注