好久没有来这里了,还就没有发表文章了,这个月初,老板突然决定要把整个项目转为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未完待续...........