这几天把项目的存储过程从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 ,里面介绍了不少迁移的经验,也是值得借鉴的。

达梦想oracle迁移,oracle存储过程迁移达梦心得相关推荐

  1. 达梦迁移oracle,达梦数据迁移工具的使用

    作为国产数据库,达梦是比较典型的一种,开发工作中会用到其他数据库表迁移到达梦数据库的问题,在此记录一下迁移方法也为他人提供方便. 该工具仅用于其他数据库表及文本文件迁移达梦,或达梦数据库表迁移到其他数 ...

  2. oracle怎么将一列挪到另一列,详细讲解Oracle数据库的数据迁移方法

    <详细讲解Oracle数据库的数据迁移方法>由会员分享,可在线阅读,更多相关<详细讲解Oracle数据库的数据迁移方法(4页珍藏版)>请在人人文库网上搜索. 1.详细讲解 Or ...

  3. mysql数据迁移 脚本_PHP将数据从Oracle向Mysql数据迁移实例

    为什么要迁移? 首先从运营成本考虑,用Mysql可以节约不少的费用.另一方面,Mysql的稳定性及功能不断地提高与增强,基本上可以满足客户的需求,如支持多 节点部署,数据分区等.还有就是Mysql使用 ...

  4. ORACLE使用copy方式存储迁移,详细讲解Oracle数据库的数据迁移方法

    添加所需的表空间和用户到目标数据库中:安装所需的SQL*Net2或者Net8软件,并配置用于连接数据库的别名. 在DOS命令提示符下设置oracle_sid=Oracle7_sid. 以Interna ...

  5. oracle数据库字符集characterset迁移及变更之csscan及csalter.plb系列四

    背景 数据库字符集涉及的概念与知识非常多,本文继续学习:相关文章链接见下: oracle数据库字符集characterset迁移及变更之csscan及csalter.plb系列三    http:// ...

  6. oracle pg 文件级迁移,Ora2pg 把oracle数据导入到postgres

    1 Ora2pg特性 1.导出整个数据库模式(表.视图.序列.索引),以及唯一性,主键.外键和检查约束. 2.导出用户和组的授权/权限. 3.导出筛选的表(通过制定表明). 4.导出Oracle模式到 ...

  7. oracle 向mysql数据迁移

      为什么要迁移? 首先从运营成本考虑,用Mysql可以节约不少的费用.另一方面,Mysql的稳定性及功能不断地提高与增强,基本上可以满足客户的需求,如支持多 节点部署,数据分区等.还有就是Mysql ...

  8. Oracle XTTS跨平台数据库迁移(从Unix迁移数据库到Linux)_Oracle数据库迁移项

    Oracle数据库迁移教程04 Oracle XTTS跨平台数据库迁移实战 (真正超越OCP/OCM的项目实战系列教程) 本套风哥Oracle教程学习内容 1.Oracle XTTS技术基础知识 2. ...

  9. Oracle数据库迁移测试数据,Oracle数据库的数据迁移方法

    Oracle数据库的数据迁移方法 发表于:2008-04-14来源:作者:点击数: 随着数据库管理系统和操作系统平台的更新换代的速度的加快,数据库管理员经常需要在两个不同的数据库之间或在两种不同的系统 ...

最新文章

  1. [LeetCode 120] - 三角形(Triangle)
  2. linux+平均磁盘请求数量_SUSE LINUX下磁盘IO性能监测分析
  3. 苹果手机(ios)拍照上传图片旋转90度问题---java后台处理
  4. 产品总监基本功:从零到壹
  5. pythontcp服务器如何关闭阻塞_python 网络编程(socketserver,阻塞,其他方法)
  6. Atitit mvc之道 attilax著 以vue为例 1. Atitti vue的几大概念 1 1.1. 声明式渲染 1 1.2. 条件与循环 2 1.3. 处理用户输入 click事件 2 1
  7. IDEA如何查看JDK源码
  8. html如何定义mime类型的作用,自定义mime类型、mime类型介绍
  9. 税控盘是服务器系统,税控盘系统设置服务器地址
  10. java中数字转换汉语中人民币的大写
  11. 【C语言】输入一个整数n,求它的位数以及各位数字之和。例如,123的位数是3,各位数字之和是6。
  12. c语言ifi=1 2,第1部分_C语言程序设计练习一全解.doc
  13. Hadoop 推测执行
  14. 计算机一级怎么截图保存到桌面,电脑怎么截图?截屏?(四种方法),划重点了...
  15. 【记录】ChatGPT|注册流程、使用技巧与应用推荐(更新至2022年12月14日)
  16. 能看到打印机共享文件就是不能连接网络打印机
  17. css 字体特效代码,css实用字体特效
  18. mysql查看表存不存在
  19. crypt-5+n凯撒密码
  20. 一入IT深似海 从此妹子为路人

热门文章

  1. Intel Realsense D435 测试视频流的直方图均衡化
  2. Python 科学计算库 Numpy (二) —— 索引及切片
  3. 分析对象内部结构,并详解synchronized锁膨胀升级和降级的过程
  4. 第二大数 滑动窗口 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛
  5. Grandma Capa Knits a Scarf 模拟,字符串
  6. java for循环 暂停_类中的2个for循环不想在第一次迭代后迭代c [暂停]
  7. spring mvc 总体启动流程
  8. 二元一次函数最值问题_高中数学必考知识点:二元一次不等式(组)及简单的线性规划问题...
  9. 先查询再插入的存储过程怎么写_谈一谈 InnoDB(1) - 底层存储文件结构
  10. it项目经理带一个项目的完整_如何控制IT项目需求范围?千万别让用户把你带沟里……...