黎俊杰的DBA生涯 2009-03-27
公司开发的一个项目因为号称是跨平台,所以在交付的时候客户要求一个oracle版本,还好大部分的sql都是写在配置文件中,于是开始了修改之路。总结一下:
1.因为Oracle不支持AUTO_INCREMENT自动递增,所以需要为所有设置了自动递增的字段建立一个Sequence来实现自动递增
2.有一些字段在mysql中不是关键字,而在oracle中是关键字,比如SIZE,COMMENT,initial,user这种情况就涉及到需要修改程序代码,不过后来通过查询发现只要在加引号就可以了。
而且在创建视图时发现select的时候也需要加上引号,比如SELECTSP."COMMENT""COMMENT",否则会报错。
3.MYSQL的text类型在oracle中需要使用long或clob来替换,但在替换的过程中发现一个table只允许有一个long的字段,所以改为用clob来替换
4.实行存储过程的转换,mysql和oracle的存储过程的语法还是有较大的不同
a.参数的位置:mysql:INpar_yearVARCHAR(20)|oracle:par_yearINVARCHAR(20)
b.定义变量:mysql:DECLARENAMEVARCHAR(20)|oracle:NAMEVARCHAR(20)
c.临时表的创建:mysql:可以直接在存储过程中写创建语句|oracle:存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行,先定义一个变量str:="'CREATEGLOBALTEMPORARYTABLESETT_DAILYTEST(.....)"
然后用“executeimmediatestr;”来调用。
e.存储过程中调用存储过程:mysql:直接call过程名()|oracle:先定义字符串:str:='callproc_getInvoiceID(:param1,:param2)';再执行“executeimmediatestrusinginoutProjectID1,invoiceId”;记得一定要带有inout。比如“executeimmediatestrusingoutRworkloads,outRlessthan,outRunit,outRnum,inTaskID1,outRresult;”
f.存储过程名长度:oracle的长度不能大于30,这个问题必须修改该过程的名称,那就还需要去修改程序的代码。
g.groupby:mysql中groupby后可以用别名,oracle却不可以。而且oracle中groupby后必须跟所有select中没有参与计算的字段
5.发现在sql中有这样一个条件,(a.ParentProject=NULLORa.ParentProject=""),在oracle中会提示错误,检查后发现是因为oracle中是没有''这个概念,null或者''都是用null来表示。
6.使用oracle时配置文件中的sql语句后面不能有分号,mysql则没有要求。
7.修改的过程中发现user这个关键字在查询的时候加了引号又会报错,应该不会是个别现象,以comment为例,测试了发现:在建表时候如果字段名是Comment,那么在查询的时候加引号的话必须是"Comment",用"COMMENT"或者"comment"都会报错。
8.mysql在insert的时候可以用value或者values,oracle只能用values.