我現要在做Oracle版的同時進行MSSql版和Oracle版的整合.並列出MSSql和Oracle之間的區別,歡迎大家討論.
有的人可能認為根據MSSql版改Oracle版很好做,
我可不是這麼認為.
我公司是用Java開發,3-Tier.一個程式大概分:
client端 (只進行用戶界面的輸入,對數據不做任何的處理)
server端 (分永久server和臨時server,每個系統有一個永久server,而每個作業都有自己的臨時server.主要進行商務邏輯和計算並進行合法性的檢測)
dba (DatabaseAccess,主要對數據庫進行讀寫操作,每個作業都有自己的dba,因為Java沒有數據窗口,所以對數據庫的每一步操作都是用SQL語句來完成)
而且每個系統中都有許多的*.sql文件,有create database,create table,init data,以及存儲過程和觸發器的生成.大大小小的*.sql文件大約有40多個.而且每個存儲過程的腳本都是不下於200行的.
我現在想在做Oracle版的同時進行MSSql版和Oracle版的整合.client端和server端是不需要動的,而每一個DBA_*.java和sp*.sql及tr*.sql文件都是要增加script和修改script的.(30多個dba,40多個*.sql).現在還有誰認為這項工作在15天之內搞定是很容易的事?
我列出MSSql和Oracle的一些區別,方便大家參考:
MSSql Oracle
Create table時字符型欄位定義 varchar,nvarchar varchar2,nvarchar2
Create table時字符型欄位定義為Isnull 可以為’’ 不可以為’’
語句間的區分符 無限制 必須用分號
Insert 可以用inset 必須用insert into
臨時 table 可以 不可以
Select Top 1 可以 不可以
必須select … from … where rownum=1
字串相加 用 + 運算符 用 || 運算符
賦值語句 Select tt=’TT’ tt :=’TT’
Msqql cursor
DECLARE Curtfm02 CURSOR FOR
SELECT ISNULL(fb09,0) FROM tfm02
WHERE billtype='S' AND nokey=@In_SCNo AND fb03=@In_ItemNo
ORDER BY billtype,nokey,fb03
OPEN tr_sp_calSItemPendAmt_Curtfm02
BEGIN TRAN tr_calSItemPendAmt
FETCH tr_sp_calSItemPendAmt_Curtfm02 INTO @m_fb09;
WHILE @@FETCH_STATUS = 0
BEGIN
…………………………
…………………………
FETCH NEXT FROM Curtfm02 INTO @m_fb09
END
CLOSE Curtfm02
DEALLOCATE Curtfm02
Oracle cursor
CURSOR Curtfm02 IS
SELECT NVL(fb09,0) FROM tfm02
WHERE billtype='S' AND nokey=In_SCNo AND fb03=In_ItemNo
ORDER BY billtype,nokey,fb03 ;
OPEN Curtfm02;
LOOP
FETCH Curtfm02 INTO m_fb09;
EXIT WHEN Curtfm02%NOTFOUND;
…………
…………
END LOOP;
CLOSE Curtfm02;
判斷一個值是否為null Isnull(,) Nvl(,)
Length function Len() Length()
得到 string 的一部分 SubString(,,) substr(,,)
轉換函數 convert() to_char()等
返回大于等于的最小整數 CEILING() CEIL()
還有很多,希望大家討論.