最近有一个项目要把原来使用的Sybase数据库改为Oracle数据库, 所以我要把sybase的脚本改成oracle的脚本, 如表结构, 存储过程, 视图等的脚本. 这种改脚本的情况可能很久才能遇到一次吧, 放到blog里面, 以后需要自己再看看, 温故知新.
(所用sybase版本是11.9.2, oracle是10g)
1. if exists
用正则表达式 where id = object_id/(/'[A-Z_]+/'/)
判断表是否存在这段不要了, 直接drop table
2. go (注意要用全词匹配)
替换为 /
3. varchar (这个要提前换)
替换为 varchar2
4. text
替换为 varchar2(4000), 还不够的话可以用 clob代替
5. datetime
替换为 date, 或者 TIMESTAMP, 后者精确到毫秒
6. 创建表的脚本中不要存在空行, 不然在用命令窗口导入的时候会出现错误
在editplus中用 正则表达式 ^[ /t]*/n 替换为 空格 取消空行( ^ 为行头开始, /n 为换行符)
全部替换的按钮按多几次, 再检查下
7. dbo.
替换为空格或者用户名
8. 建立主键
CONSTRAINT PK_BDG_SDC_PRJ_ZP PRIMARY KEY CLUSTERED (ID)
中的CLUSTERED 要去掉
9. 去掉 LOCK ALLPAGES
10. getdate()
替换为 sysdate
11. isnull()
替换为 nvl()
11. 如果出现重复创建表的时候
把表上面的注释 /*********/ /****************
/* */ 改为 * *
/*********/ *****************/
原先不是很清楚, 不过通常是下面要建立的表的名称太长就会出现这种情况
12. 存储过程
A. 参数: 在存储过程名称后面(p1, p2,.....)
命名开头不能为 @ ;
要指明in 和 out ;
参数类型不能带括号部分;
B. 变量: 不用关键字 declare , 直接" t_time varchar2(20); t_seq int; "(注意要带" ; ") ;
在as 和 begin 中间定义;
给变量赋值 " varA := value; "
和" select keyA into varA from tableA; " ;
C. 在每个完整的语句后面要加 " ; ";
没有直接" return 1 ; "的, 但是可以" return; " 直接中断存储过程;
没有" begin transaction ", 但可以用" commit; "和" rollback; " (是不是每次执行都会建立隐性的事务我就不知道了);
要返回select的结果集, 必须用游标, 不过需要建立一个包A才行, 在这个包A中定义一个"type cursorType is ref cursor; "这样一个游标
类型, 然后再加一个输出参数"p_cursor out A.cursorType ", 内容里面" open p_cursor for select ......; " ;
DDL的语句必须用动态SQL, 如"v_sql:='drop table TMP_XMZ_REPORT'; EXECUTE IMMEDIATE v_sql; ";
D. 控制结构
if...else
sybase: if(条件) begin 代码块 end(如果只有一句代码, 可以不用begin end)
else begin 代码块 end(如果只有一句代码, 可以不用begin end)
oracle: if(条件) then 代码块
else 代码块 end if;
E. 游标
在sybase里面可以直接 " declare CUR1 cursor for select..... ", 这个貌似在oracle不行,
不过可以用" for cur1_record in ( select....) loop 代码块 end loop; ";