oracle存储过程迁移达梦心得「建议收藏」

oracle存储过程迁移达梦心得「建议收藏」这几天把项目的存储过程从oracle迁移到了达梦8,记录一下心得。国产数据库做到这样,已经算很了不起了,跟oracle兼容性确实很高。 但还是有一些细节没做好,主要是出错提示不友好,另外一个网上的资料

oracle存储过程迁移达梦心得

这几天把项目的存储过程从oracle迁移到了达梦8,记录一下心得。国产数据库做到这样,已经算很了不起了,跟oracle兼容性确实很高。

但还是有一些细节没做好,主要是出错提示不友好,另外一个网上的资料也很少,出问题不好定位。(达梦的错误码比较简单,就是一个负数,不像oracle是ora-错误码,在百度时输入一个负数搜索信息,跟一长串错误码搜索效率差很远)

准备工作:

1 达梦的数据库管理工具默认不显示行号,也不能自动补全,需要手动设置。行号设置方法:在sql编辑页面,左侧空白竖栏(一般编辑器显示行号的地方)右击,选择”显示行号“。自动补全设置方法:在sql编辑页面空白处右击,选择“选项”,弹出的界面展开“查询分析器”,进入“编辑器”配置页面,选中“启用SQL输入助手”

2 装完达梦数据库后,需要启动oracle兼容模式sp_set_para_value(2,‘COMPATIBLE_MODE’,2);,另外,需要启动dbms_job包,SP_INIT_JOB_SYS(1)。改完设置后记得重启。

迁移碰上的问题及解决方法:

1 使用达梦的数据库迁移工具,把oracle的用户整体迁移到达梦后,是变成一个模式,而不是用户,使用起来不方便。

​ 解决方法:达梦数据库有用户和模式两个概念,库表和存储过程等是建在模式下面的,而用户则是独立的,与安全和权限功能挂钩,这跟mysql比较像。达梦的用户进行数据库操作时,默认使用同名的模式,想访问其它模式的元数据,需要显式加模式名。所以为了跟oracle保持一致,在迁移完后,需要手工给达梦添加oracle同名用户。

2 迁移后发现有一些存储过程,包等缺失。

​ 解决方法:迁移工具做得不是太好,有一些oracle数据库的元素是不会自动迁移的,需要手工处理。例如oracle的type(达梦叫“类”),一些包含达梦数据库关键字的存储过程等。(在迁移日志里面没报错的,但也是可能没迁成功,需要仔细检查)

3 oracle建SEQUENCE里面的关键字MINVALUE达梦不支持

4 达梦的关键字比oracle多很多,例如CONTEXT,bool,class,decode这些,oracle不是关键字,但达梦是。

​ 解决方法:给这些使用了关键字的字段名或者变量名加上””,并且转换成大写就可以了。例如”CLASS”

5 建了包,提示创建成功,编译有错,但没有具体说明错误地方。

​ 解决方法:可以在后面增加语句:alter package q$err_mgr compile;

6 提示“第3156 行附近出现错误[-3719]: 非法的基类名[DBMS_SQL]”

​ 解决方法:首先确认DBMS_SQL包是否启用(在左侧“工具包”菜单右键,选择启用)。如果启用了后还报这个错,则需要检查是否使用了某些DBMS_SQL的类型或者函数,在oracle有,但是在达梦没有的。

7 编译包时提示“第3494 行附近出现错误[-2193]:无效的方法名[func_name]”

​ 解决方法:这种提示原因有很多,可能是确定在包里面没有定义这个func_name,也可能是func_name不在包头里面声明,但在初始化代码里面调用。(oracle允许只在包体里面定义,达梦不允许)。也可能是调用func_name的函数跟func_name都不在包头声明,但是在包体定义时,func_name出现位置比调用处更晚,在达梦这种是不允许的。

8 regexp系统函数提示“参数不兼容”

​ 解决方法:达梦的regexp系统函数的参数名与oracle的不一样,如果原来在oracle指定了参数名,搬到达梦编译时容易出现这个错。改为非显示命名函数参数就好。

9 出现提示“第646 行附近出现错误[-3325]:包/对象[package_name]解析失败”,但646行代码是空白行

​ 解决方法:达梦的报错位置不是太准确,这种情况下一般是上下文语法解析出现问题导致的。我碰到比较多的情况是在for循环语句里面使用了case when … end子句。达梦8对于case when支持不太好,容易把case when的end关键字与begin配对了,导致语法错乱。我的解决方法是使用decode改写case when

10 报错提示“无法解析的成员访问表达式[XXX] ”

​ 解决方法:这类错误主要是因为其它包之类的编译失效导致,需要具体分析再解决。有时会出现循环引用的情况(a包引用b包的函数,b包引用a的函数),达梦支持不太好,编译a时提示b的函数有问题,编译b时提示a的函数有问题。我的解决方法是建立一个c包,把一些代码从a和b抽出来,避免循环引用。大部分时候循环引用是可以编译过的,也可能是由于其它错误引起包编译不过,但是系统没提示好。这种情况下只要解决了另外的错误,这个循环引用编译失败的问题也就解决了。

11 提示“非法的基类名[ROWID]”

​ 解决方法:我的代码里面使用了rowid类型变量,我直接改成number了

12 达梦对于重载(覆盖)支持不太好

​ 解决方法:oracle里面两个同名函数,参数一样,只是一个是IN类型参数 ,一个是IN OUT参数,是被认为是两个不同类型的函数,可以正常重载。但达梦认为是同一个函数,编译时会出错。解决办法是把其中一个改名。另外,oracle里面varchar2(64),varchar2(1024)是两种不同的类型,可以支持重载两个函数,参数为这两种类型,但在达梦不支持。oracle里面同名的CONSTANT变量定义,后出现的会覆盖先出现的。但在达梦里面不支持。提示“错误号: -2120 无效的变量名”

迁移过程中也许还会碰上其它问题,处理原则是查官方帮助文档(在帮助菜单下面搜索,同时在安装目录下面也有很多pdf文件介绍),查百度,问官方支持。(我另了达梦的技术支持群,群里的南网工作人员还是挺热心的)

有时官方支持也搞不清楚,需要自己通过删减代码,慢慢定位问题,再自己猜测出错原因并尝试解决。

另外,之前有人写过一份教程《oracle迁移达梦常见问题汇总》 https://www.cndba.cn/foucus/article/4142 ,里面介绍了不少迁移的经验,也是值得借鉴的。

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

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

相关推荐

  • 数据库设计的十个最佳实践方案_一个完美的数据库设计需要具备

    数据库设计的十个最佳实践方案_一个完美的数据库设计需要具备数据库是应用及计算机的核心元素,负责存储运行软件应用所需的一切重要数据。为了保障应用正常运行,总有一个甚至多个数据库在默默运作。我们可以把数据库视为信息仓库,以结构化的方式存储了大量的相关信息,并合理

    2023-04-29
    135
  • 如何以本地图片生成链接

    如何以本地图片生成链接在网站开发过程中,经常需要使用图片,而有时候需要将图片转换为链接以便于跳转到其他页面。如果图片已经存储在本地,该如何生成链接呢?本文将为大家介绍如何以本地图片生成链接。

    2024-05-08
    78
  • mysql用户管理_MySQL实战45讲

    mysql用户管理_MySQL实战45讲本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。

    2023-04-22
    158
  • 用 Python 表示根号

    用 Python 表示根号作为一种常用的运算符,求平方根在数学和计算科学领域经常被使用。而在编程语言 Python 中,表示平方根同样既简单又灵活。在本文中,我们将具体介绍如何用 Python 表示根号。

    2024-05-14
    60
  • 数据库的优点_sql可视化

    数据库的优点_sql可视化文章的开头我们先来看下什么是图数据库,根据维基百科的定义:图数据库是使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。 虽然和关系型数据库存储的结构不同(关系型数据库为表结构,图…

    2023-02-03
    132
  • Python字符串小写操作

    Python字符串小写操作Python是一种易于使用且功能强大的编程语言。它在处理字符串时有着出色的表现。Python字符串小写操作是一种非常常见的字符串操作,它有许多应用场景。在本文中,我将从多个方面详细介绍Python字符串小写操作,帮助您在编写代码时最大化利用这一功能。

    2024-08-22
    29
  • 使用Python的TextBlob进行自然语言处理

    使用Python的TextBlob进行自然语言处理自然语言处理是一项涉及人工智能和语言学的研究领域,其目标是开发出能够理解和使用人类语言的计算机程序。使用Python的TextBlob进行自然语言处理是一种快速、方便和高效的方法,它提供了许多功能,包括分词、词性标注、命名实体识别和情感分析等。在本文中,我们将介绍TextBlob的基本知识和如何使用它进行自然语言处理。

    2024-05-08
    75
  • sql求合计值(rollup函数应用)[通俗易懂]

    sql求合计值(rollup函数应用)[通俗易懂]CREATE TABLE `test1` ( `id` varchar(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `count` var…

    2023-03-25
    152

发表回复

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