悲催的MSSQL 2 Oracle之旅(一)

本文分享了从MSSQL迁移至Ora平台的实际经验,详细介绍了表结构和数据导入过程中遇到的问题及解决方案,包括表名大小写调整、自增列处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久没有来这里了,还就没有发表文章了,这个月初,老板突然决定要把整个项目转为Ora平台,可是苦于公司人手不够,只能我自己来了,Ora以前只是接触过皮毛,心里还真是没有底,现在把开发过程中碰到的问题记录下来:

第一天:表结构的导入,这算是骨架吧,刚开始尝试过使用MSSQL的导入导出,这样确实能导过来,但是随之而来也出现了不少问题,这样导入的时候不只是表结构,包括数据也过来了,这本身是好事,可是由于数据库中个别表数据量特别大,导致内存不能使用,导入失败。

只能想别的办法,这时想到了使用Pb将表结构导过来,结果很好,也很满意,但是之后发现,有些表的名字带了“”,这在Ora中使用""是严格区分大小写,查询的时候也必须""这样了,会给程序后期的修改带来麻烦,但是实在想不出别的办法来了(知道的请指教),网上倒是有转换工具,不过都收费,还有就是自己写程序倒,可惜本人比较懒.........

后来在网上找到了一段代码,批量修改数据库中表名的:

declare
  v_sql varchar2(1000);
  cursor cur is select 'alter table "'||t1.table_name||'" rename to '||upper(t1.table_name) as sqlstr
              from user_tables t1
             where table_name<>upper(table_name)
               and not exists (select 1 from user_tables t2 where t2.table_name=upper(t1.table_name) );
begin
  for rur in cur loop
    v_sql := rur.sqlstr;
    execute immediate v_sql;
  end loop;
end;
/


其实就是替换下

这样表结构算是完成了,但是后来发现还有问题,因为有的表中自增列没有生成脚本,而且默认值依然是getdate(),Ora中是sysdate

这样如果有自增列的话该如何解决?

由于我的表中大部分为自增列为ID,所以写了一个存储过程,如下:

CREATE OR REPLACE PROCEDURE p_batch AUTHID CURRENT_USER
  AS
  v_tablename VARCHAR2(30);
  cursor c is select substr(tc.table_name,0,25) from user_tab_columns tc,user_tables t where tc.column_name='ID' and t.table_name = tc.table_name;
  BEGIN
  open c;
  LOOP
    FETCH c
      INTO v_tablename;
    EXIT WHEN c%NOTFOUND;
      --创建序列
      dbms_output.put_line(v_tablename);
      BEGIN
        EXECUTE IMMEDIATE 'drop sequence seq_' || v_tablename;
      EXCEPTION
        WHEN OTHERS THEN
          NULL;
      END;
      EXECUTE IMMEDIATE 'create sequence seq_' || v_tablename ||
                        ' start with 1 increment by 1';
      --创建触发器

      EXECUTE IMMEDIATE 'create or replace trigger tr_' || v_tablename ||
                        ' before insert on ' || v_tablename ||
                        ' for each row
                        DECLARE next_id NUMBER;
            begin
              select seq_' || v_tablename ||
                        '.nextval into next_id from dual;
                        :new.id := next_id;
            end;';
  END LOOP;
END;

这样总算是部分完成了,搭好了库的骨架,剩下的就是血肉了.

对于部分表的字段如果使用PB的话也可能会加上“”,这样查询的时候必须修改程序保证大小写一样,这样比较麻烦,当然可以使用

alter table tablename rename column "" to ..来替换,如果要全部替换最好写个存储过程,等以后有时间在写吧!~~~

第二天:数据的导入

 由于实在是不知道有什么别的更好的办法,所以只能用SQL2008的导入导出工具,感觉这个还不如SQL2000的好用呢.....

不过这里提一个收费的工具Convert MSSQL2Oracle未完待续...........

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值