所有系统必须能够支持多数据库系统,对于SQL语法应该尽量使用简单、标准语法,特殊语句必须符合以下规定:
1、特殊语法类
SQLServer语法:case [] when [] then [结论1] else [结论2] end
SELECT CASE 1 WHEN 1 THEN 1 ELSE 0 END
Oracle对应语法:decode([],[],[then结论1],[else结论2])
SELECT DECODE(1,1,1,0) FROM DUAL
SQLServer语法:LEFT JOIN、RIGHT JOIN
SELECT * FROM TBL1 LEFT JOIN TBL2 ON TBL1.A = TBL2.A
SELECT * FROM TBL1 RIGHT JOIN TBL2 ON TBL1.A = TBL2.A
Oracle对应语法:+
SELECT * FROM TBL1,TBL2 WHERE TBL1.A = TBL2.A(+) --LEFT JOIN
SELECT * FROM TBL1,TBL2 WHERE TBL1.A(+) = TBL2.A --RIGHT JOIN
INNER JOIN
SQLServer语法:INNER JOIN
Oracle对应语法:无,只能通过WHERE A.ID = B.ID的方式完成
TOP
SQLServer语法:TOP num
Oracle对应语法:提供了更加高效的语法,而且功能更强大,不过除非必要否则最好不要用
SELECT * FROM TBL1 WHERE ROWNUM <= num
SELECT * FROM TBL1 WHERE ROWNUM >= num1 AND ROWNUM <= num2
说明:9i之后Oracle能够支持部分SQLServer的语法模式,目前公司的系统以10G为基础,需要先保证10G及SQLServer能够正常运行。Oracle的SELECT语句必须有FROM子句,
对于如上选择无来源表的都统一使用对象DUAL;
2、特有函数类
SQLServer -----> Oracle
SUBSTRING SUBSTR
LEN LENGTH
+ || (字符串连接)
CONVERT(varchar(10),[date],120) TO_CHAR([date],[formatstring]) (转成日期格式为YYYY-MM-DD)
GETDATE() SYSDATE
CAST TO_XXX函数
3、多语句模式
SQLServer必须用;进行分隔
Oracle需要用begin...end进行处理
例如:
insert into tbl(a) values('1');insert into tbl(a) values('2');
begin
insert into tbl(a) values('1');
insert into tbl(a) values('2');
end;
说明:使用到某些函数及语法时最好能够进行确认一下Oracle10G版本是否能够支持,如果不行就需要采用多套语法的方式进行。