因工作需要将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并未检测出来,而是在运行到相关代码时才报错。