悲催的MSSQL 2 Oracle之旅(一)

好久沒有來這裏了,還就沒有發表文章了,這個月初,老闆突然決定要把整個項目轉爲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未完待續...........

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章