您的位置:首页 > 数据库 > Oracle

Sybase脚本修改为oracle脚本备忘

2009-04-07 11:53 197 查看
最近有一个项目要把原来使用的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; ";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: