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