免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2748 | 回复: 3

informix存储过程迁移oracle [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2012-07-02 17:37 |显示全部楼层


需求:需要将informix数据库中的存储过程通过shell脚本自动转化为oracle中的存储过程

informix存储样例:
  1. drop procedure circuit_tmp_update();
  2. create procedure circuit_tmp_update();
  3.     define objectid_v varchar(128);
  4.     define circuitnumber_v varchar(128);
  5.     define aendzhandianobjectid_v varchar(128);
  6.     define zendzhandianobjectid_v varchar(128);
  7.     define aendswitchbuildingobjectid_v varchar(128);
  8.     define zendswitchbuildingobjectid_v varchar(128);
  9.     define rel_zhandian_id_v varchar(128);
  10.     define zd varchar(128);
  11.     define id varchar(128);
  12. set debug file to '/home/informix/yuy/circuit_tmp_update.log';
  13. --开启跟踪所有执行的语句
  14. trace on;
  15. trace '开始执行存储过程';
  16. begin
  17. --异常捕捉
  18. on exception
  19. rollback work;
  20. return;
  21. end exception
  22. begin work;
  23. --1、创建临时表
  24. trace '开始创建tmp_table_circuit_a表';
  25. create table tmp_table_circuit_a(
  26. objectid varchar(128),
  27. circuitnumber varchar(128),
  28. rel_zhandian_id varchar(128),
  29. aendswitchbuildingobjectid varchar(128));
  30. trace 'tmp_table_circuit_a表创建完成';
  31. trace '开始创建tmp_table_circuit_z表';
  32. create table tmp_table_circuit_z(
  33. objectid varchar(128),
  34. circuitnumber varchar(128),
  35. rel_zhandian_id varchar(128),
  36. zendswitchbuildingobjectid varchar(128));
  37. trace 'tmp_table_circuit_z表创建完成';

  38. --查询circuit表中zhandianid为空的数据
  39. foreach c0
  40.         for select objectid,circuitnumber,aendzhandianobjectid,zendzhandianobjectid,aendswitchbuildingobjectid,zendswitchbuildingobjectid
  41.         into objectid_v,circuitnumber_v,aendzhandianobjectid_v,zendzhandianobjectid_v,aendswitchbuildingobjectid_v,zendswitchbuildingobjectid_v from circuit
  42.         --如果circuit表中aswitchbuildingobjectid不为空,则根据aswitchbuildingobjectid找到jifang表中的rel_zhandian_id
  43. trace '开始查询符合条件的A端数据';
  44.         if aendswitchbuildingobjectid_V != '' and aendswitchbuildingobjectid_V != 'null' then
  45.                 select rel_zhandian_id into rel_zhandian_id_v from jifang where objectid=aendswitchbuildingobjectid_v;
  46.                 insert into tmp_table_circuit_a values (objectid_v,circuitnumber_v,rel_zhandian_id_v,aendswitchbuildingobjectid_v);
  47.         end if;
  48. trace 'A端数据更新完成';
  49.         --如果circuit表中zswitchbuildingobjectid不为空,则根据zswitchbuildingobjectid找到jifang表中的rel_zhandian_id
  50. trace '开始查询符合条件的Z端数据';
  51.         if zendswitchbuildingobjectid_V != '' and zendswitchbuildingobjectid_V != 'null' then
  52.                 select rel_zhandian_id into rel_zhandian_id_v from jifang where objectid=zendswitchbuildingobjectid_v;
  53.                 insert into tmp_table_circuit_z values (objectid_v,circuitnumber_v,rel_zhandian_id_v,zendswitchbuildingobjectid_v);
  54.         end if;
  55. trace 'Z端数据更新完成';
  56. end foreach;
  57. --更新A端数据
  58. foreach c0
  59.         for select objectid,rel_zhandian_id into id,zd from tmp_table_circuit_a
  60.         update circuit set aendzhandianobjectid=zd where objectid=id;
  61. end foreach;
  62. --更新Z端数据
  63. foreach c0
  64.         for select objectid,rel_zhandian_id into id,zd from tmp_table_circuit_z
  65.         update circuit set zendzhandianobjectid=zd where objectid=id;
  66. end foreach;
  67. --5、提交事务
  68. commit work;
  69. end;
  70. trace '存储过程执行完毕';
  71. --关闭跟踪
  72. trace off;
  73. end procedure;
  74. execute procedure circuit_tmp_update();
复制代码
informix存储过程迁移oracle的异同,希望能够在这里与大家讨论下这个是否可以直接写个shell脚本自动转换
http://woying.me/blog/rewrite.php/read-265.html

论坛徽章:
3
15-16赛季CBA联赛之辽宁
日期:2017-12-28 12:15:1015-16赛季CBA联赛之福建
日期:2017-12-28 12:26:5115-16赛季CBA联赛之新疆
日期:2018-03-07 15:09:17
发表于 2012-07-03 23:02 |显示全部楼层
这个不可能实现吧。
数据库迁移是庞大的工程,想用shell脚本实现不切实际呀。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
发表于 2012-07-04 08:07 |显示全部楼层
例子里已经包括全部命令了吗?还有,有没有一一对应的Oracle 命令,还是只要是符合sqlplus 标准的命令就行?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2012-07-12 15:41 |显示全部楼层
回复 3# rdcwayx


    实在是抱歉,,,前几天忙着做个迁移工作,没有及时回复大家,命令已经全部在这个例子里面了。。。


   这个估计实现起来有点麻烦,,,最后我们都是通过手工一个一个修改好的,我贴出一个短点的例子,大家看看是否可以做成shell。

informix存储
  1. create procedure "informix".pc_report_reportcitynum()
  2. define cityname varchar(32);
  3. DEFINE  I INT ;
  4. let I = 0;
  5. foreach t for
  6.         select city into cityname
  7.         from district where  (country = '' or country is null) and city!=''
  8.         order by city asc
  9.         let I=I+1;
  10.         insert into reportcitynum(cityname,num) values(cityname,I);
  11. end foreach;
  12. end procedure;
复制代码
oracle存储
  1. CREATE OR REPLACE PROCEDURE PC_REPORT_REPORTCITYNUM
  2. is
  3. cityname varchar2(32);
  4. c_temp varchar2(32);
  5. c_count integer :=0;
  6. cursor c_flag is select city into cityname
  7.   from district where  (country = '' or country is null) and city is not null
  8.   order by city asc;
  9. begin
  10.   for c_temp in c_flag loop
  11.   c_count := c_count +1;
  12.   insert into reportcitynum(cityname,num) values(cityname,c_count);
  13.   end loop;
  14. end;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP