oracle迁移到人大金仓

因工作需要将oracle数据库迁移到金仓数据库,本人安装使用了KingBase V8 R3(以下简称KingBase),主要内容是完成复杂存储过程的迁移,其复杂在于:代码量大,业务逻辑复杂,多个存储过程、函数存放在不同的包内,存储过程之间存在多次相互嵌套调用。
存储过程的迁移需要人工手动迁移,这一点在KingBase的管理员手册有明确说明:
在这里插入图片描述

下面将迁移中的一些方法、踩坑经验记录下来,欢迎大家对号入座~~

下载安装

金仓官网下载
在这里插入图片描述
在这里插入图片描述
自行选择版本(本人使用的是V8 R3版本)
安装过程略

资料分享

下载的文件中含有用户手册,大家根据需要自行翻阅
在这里插入图片描述
本人对其中《安装与更新》、《开发手册》、《速查手册》、《管理员手册》使用频率较高

技术支撑

有疑难问题时可加此群求助在这里插入图片描述

oracle迁移总结

1.表、序列等简单数据库对象的迁移很简单,使用金仓提供的数据迁移工具即可,具体使用步骤可参考用户手册
在这里插入图片描述
这里有个小发现:数据迁移工具将oracle中的表迁移后,对比一下各字段,就可以知道oracle中字段类型与KingBase是如何对应的了。

2.语法差异点:

  • 声明存储过程、函数的写法差异
  • 调用存储过程、函数的写法差异
  • Kingbase中的 REFCURSOR 数据类型可以替代 Oracle 的 SYS_REFCURSOR
  • Kingbase提供的 RAISE NOTICE 替代Oracle 的输出语句 dbms_output.put_line
  • Kingbase提供REGEXP_SPLIT_TO_TABLE函数实现按指定符号分割成表功能,对应oracle中写法为select * from table(tableName);
    在这里插入图片描述
  • KingBase使用REGEXP_LIKE代替oracle中REGEXP_INSTR函数
  • case when与分号的报错
    在这里插入图片描述
  • Action的报错
    在这里插入图片描述
  • 使用RAISE EXCEPTION 抛出异常
  • 避免%Type的写法
  • 在这里插入图片描述
  • 使用nextval()序列的写法
    在这里插入图片描述
  • 列举几个常用字符串处理函数
select regexp_replace('#01234abcDEFe#','B','*') as new_str from dual;
SELECT replace('abcdefabcdef', 'cd','XX');
SELECT overlay('Txxxxas' placing 'hom'from 2 for 1);

3.数据库对象管理工具
一个类似于PL/SQL Developer的工具,打开后的整体界面风格如下,有点小清新
在这里插入图片描述

  • 点击程序包报错
    在这里插入图片描述 在这里插入图片描述
    这个报错信息很奇怪,其实是因为迁移过来的表与KingBase自带的表重名了,比如:sys_user、sys_config,所以建议大家的业务表名不要以sys_开头
  • 存储过程debug过程中,工具经常卡死
    在这里插入图片描述
    就这样卡死了
    在这里插入图片描述
    强制关闭后弹出如下提示:
    在这里插入图片描述
    个人使用体验:这个功能基本不能正常使用
    debug功能不能正常使用,那么如何对迁移后的代码进行测试呢?这里提供两种思路:
    第一种:将存储过程中的代码分段手动复制出来执行,观看执行结果,分析程序是否正确
    第二种:在存储过程中重要分支判断处添加日志输出信息,输出关键参数信息等,据此分析程序是否正确
  • 应用程序调用存储过程,cannot begin/end transactions in PL/SQL报错
    在这里插入图片描述
    尝试把存储过程中的commit、rollback等注释掉即可,金仓数据库好像是通过begin/end块默认控制事务
    个人建议可以把事务交给服务层(java)去统一控制
  • 特别注意不要选择错数据库(工具有时不会自动切换),否则各种报错
    在这里插入图片描述
  • 通过“新建查询”窗口来编译更新整个存储过程,不要通过工具提供的对存储过程的编辑功能来更改
  • 补充说明一点:与PL/SQL Developer相比,KingBase的编译报错信息提示还不是特别准确,很多时候根据提示信息不能直观的判断出问题所在,有时需要人为的去推测哪里写法出现了问题。还有部分应该编译时发现的错误,KingBase并未检测出来,而是在运行到相关代码时才报错。

猜你喜欢

转载自blog.csdn.net/csdnklsdm/article/details/118366598