sql server 2000移植到orcle的心得體會(轉)
移植過程:采用的 oracle 的移植工具 Migration WorkBenth 。
移植注意事項:
1. 移植前要在 ODBC 中建立 DSN ,由于移植的是 sql server 2000 ,驅動選 sql server 。
2. 在 oracle 實例中建立登陸用戶,包括用戶名和密碼,并賦予權限( connect , resource 和 dba )。這在使用 WorkBenth 過程中是要填寫的內容。
3. 移植過程分為獲取 sql server Model ,建立 oracle Model 和導入數(shù)據(jù)三部分。
4. 移植后我們會發(fā)現(xiàn)在 oracle 實例中有兩個方案生成: omwb_emulation 和 sa 。其中 omwb_emulation 可以不予理會,它主要提供了弱游標,供 sa 方案中的存儲過程調用。對于方案 sa 我們會注意到幾點:原來 sql server 中的數(shù)據(jù),包括表,視圖,存儲過程,索引等都在這個方案中存放;原來 sql server 表中的種子類型數(shù)據(jù)在方案 sa 中被統(tǒng)一管理,放在“序列”中;
原來的數(shù)據(jù)庫名稱 xihang_info 現(xiàn)在是方案 sa 中的表空間。
移植后注意事項:
1. 因為應用程序使用的是 ODBC, 涉及到幾個連接字符 : dsn username 和 password 。由于應用程序中的連接字符串是 conn.Open("sczb","sczb","sczbpw") ,而現(xiàn)有的 schema 是 sa ,連接失敗。現(xiàn)在有兩種方案:改連接字符串或從新建立一個方案 sczb 。這里我們采用了第二種方案,新建方案 sczb 。
方法是:先新建用戶 sczb, 密碼是 sczbpw, 權限是 connect , resource , dba ;然后將方案 sa 導入到方案 sczb 中(若是導入到另外機器上,方案 omwb_emulation 一并導出再導入)。
2. 在 sczb 中修改視圖和存儲過程。修改視圖只要把 sql 語句中的方案名 sa 刪除或改為即可。存儲過程需要修改的內容比較多,具體見下:
修改存儲過程:
1. 修改臨時表
SQL 的臨時表用 # 或 ## 開頭,使用完后自動釋放, ORACLE 的臨時表則存在數(shù)據(jù)庫中,每個會話的數(shù)據(jù)都互不干涉。 語法分別為: CREATE TABLE #TEMP ( ID INT , NAME VARCHAR ( 20 )) CREATE GLOBAL TEMPORARY TABLE TEMP ( ID INT , NAME VARCHAR ( 20 ))
2. IDENTITY 字段
Oracle 不支持自增長類型,在向表中插入含有 IDENTITY 字段的記錄時,要顯示聲明。例如:
Insert into tbl values (序列名 .nextval, 字段 1 ,字段 2 ,。。。)。
3.
SQL
與
ORACLE
的游標
SQL
的游標用
@@FETCH_STATUS
判斷是否還有數(shù)據(jù),
ORACLE
的游標用
%FOUND
、
%NOTFOUND
來判斷游標是否結束。
4. 連接字符串:
SQL 的字符串連接用 + 號, ORACLE 字符串連接用 || ,單引號可以做轉義符。因為在 sql server
中 number 類型的“ + ”運算也用到 ”+”, 因此在移植后 oracle 對于 number 類型的“ + ”有時識別不出來,而作為字符連接來處理。
5. 游標的名稱在移植后會有重復。不允許。
6. 日期類型數(shù)據(jù)要注意
其格式不同于 sql server 中的“ yyyy-mm-dd ”格式,而是“ dd-x 月 -yyyy “格式。要用 to_char(?,’yyyy-mm-dd’) 處理成 sql server 一樣的格式。
7. oracle 獲取 sql 語句所影響的行數(shù)時,不像 sql server 中 @@rowcount 直接獲取那么簡單,要分以下三種情況。
Oracle 中對于隱性游標,獲取行數(shù)的方法是通過 SQL%rowcount 直接獲得。
對于顯性游標獲取行數(shù)通過 cursor_name%rowcount 獲得,但有有以下 sql 語句:
For index in cusor_name loop
變量名: =cursor_name%rowcount;
End loop;
Fetch into 語句的話, rowcount=1
8. 獲得年,月,日在 oracle 中不支持 year (), month ()和 day ()函數(shù)。
解決的方法是通過 substr ()函數(shù)。例如獲取‘2000-01-10’的‘年’,可以通過substr(‘2000-01-10’,1,4)得到。
9. oracle 不支持 case 語句。
在 sql server 中語句:
CASE WHEN (GROUPING(BM_Name2) = 1)THEN ' 合計 ' ELSE ISNULL(BM_Name2,' 未知 ') END AS BM_Name2,
在 oracle 改寫為 decode 語句:
decode(GROUPING(BM_Name2),1,' 合計 ',nvl(BM_Name2,' 未知 ')) BM_Name2
10. 左右連接問題。
在 sql server 的連接語句如:
select a.id , b.yueshj from jh_wh_xiangmu as a left join jh_lr_zongliang as b on a.id=b.xiangmid
在 oracle 中應改為:
Select a.id, b.yueshj from jh_wh_xiangmu a, jh_lr_zongliang b where a.id=b.xiangmid(+);
在 sql server 的連接語句如:
select a.id , b.yueshj from jh_wh_xiangmu as a left join jh_lr_zongliang as b on trim(a.id)=trim(b.xiangmid)
在 oracle 中應改為:
Select a.id, b.yueshj from jh_wh_xiangmu a, jh_lr_zongliang b where trim(a.id)=trim(b.xiangmid(+))
11 .改好的存儲過程,不能編譯通過就認為 ok 了。編譯通過只能說明在語法上沒有問題了,要進一步執(zhí)行看邏輯上是否還有問題。在編譯時產生的錯誤是 pl/sql 錯誤,在執(zhí)行時的錯誤是 ora 錯誤。
12. 在 sql/plus 或 worksheet 中執(zhí)行存儲過程的語句是: execute 存儲過程名(‘參數(shù) 1 ‘,’參數(shù) 2 ‘,。。)
但在執(zhí)行返回多條記錄集的存儲過程,也就是參數(shù)中含有 RC1 IN OUT Omwb_emulation.globalPkg.RCT1 的存儲過程時,執(zhí)行起來略有不同。在 sql plus 中執(zhí)行的語法如下:
Sql 〉 var rc1 refcursor;
Sql 〉 execute pro_name(‘ 參數(shù) 1 ‘,’參數(shù) 2 ‘,: rc1 ,。。 ) ;
Sql 〉 print rc1 ;
posted on 2007-01-25 11:40 都市淘沙者 閱讀(1463) 評論(0) 編輯 收藏 所屬分類: Oracle/Mysql/Postgres/