移植過程:采用的
oracle
的移植工具
Migration WorkBenth
。
移植注意事項(xiàng):
1.
移植前要在
ODBC
中建立
DSN
,由于移植的是
sql server 2000
,驅(qū)動選
sql server
。
2.
在
oracle
實(shí)例中建立登陸用戶,包括用戶名和密碼,并賦予權(quán)限(
connect
,
resource
和
dba
)。這在使用
WorkBenth
過程中是要填寫的內(nèi)容。
3.
移植過程分為獲取
sql server Model
,建立
oracle Model
和導(dǎo)入數(shù)據(jù)三部分。
4.
移植后我們會發(fā)現(xiàn)在
oracle
實(shí)例中有兩個方案生成:
omwb_emulation
和
sa
。其中
omwb_emulation
可以不予理會,它主要提供了弱游標(biāo),供
sa
方案中的存儲過程調(diào)用。對于方案
sa
我們會注意到幾點(diǎn):原來
sql server
中的數(shù)據(jù),包括表,視圖,存儲過程,索引等都在這個方案中存放;原來
sql server
表中的種子類型數(shù)據(jù)在方案
sa
中被統(tǒng)一管理,放在“序列”中;
原來的數(shù)據(jù)庫名稱
xihang_info
現(xiàn)在是方案
sa
中的表空間。
移植后注意事項(xiàng):
1.
因?yàn)閼?yīng)用程序使用的是
ODBC,
涉及到幾個連接字符
: dsn username
和
password
。由于應(yīng)用程序中的連接字符串是
conn.Open("sczb","sczb","sczbpw")
,而現(xiàn)有的
schema
是
sa
,連接失敗。現(xiàn)在有兩種方案:改連接字符串或從新建立一個方案
sczb
。這里我們采用了第二種方案,新建方案
sczb
。
方法是:先新建用戶
sczb,
密碼是
sczbpw,
權(quán)限是
connect
,
resource
,
dba
;然后將方案
sa
導(dǎo)入到方案
sczb
中(若是導(dǎo)入到另外機(jī)器上,方案
omwb_emulation
一并導(dǎo)出再導(dǎo)入)。
2.
在
sczb
中修改視圖和存儲過程。修改視圖只要把
sql
語句中的方案名
sa
刪除或改為即可。存儲過程需要修改的內(nèi)容比較多,具體見下:
修改存儲過程:
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
的游標(biāo)
SQL
的游標(biāo)用
@@FETCH_STATUS
判斷是否還有數(shù)據(jù),
ORACLE
的游標(biāo)用
%FOUND
、
%NOTFOUND
來判斷游標(biāo)是否結(jié)束。
4.
連接字符串:
SQL
的字符串連接用
+
號,
ORACLE
字符串連接用
||
,單引號可以做轉(zhuǎn)義符。因?yàn)樵?/span>
sql server
中
number
類型的“
+
”運(yùn)算也用到
”+”,
因此在移植后
oracle
對于
number
類型的“
+
”有時識別不出來,而作為字符連接來處理。
5.
游標(biāo)的名稱在移植后會有重復(fù)。不允許。
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
中對于隱性游標(biāo),獲取行數(shù)的方法是通過
SQL%rowcount
直接獲得。
對于顯性游標(biāo)獲取行數(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 '
合計(jì)
' ELSE ISNULL(BM_Name2,'
未知
') END AS BM_Name2,
在
oracle
改寫為
decode
語句:
decode(GROUPING(BM_Name2),1,'
合計(jì)
',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
中應(yīng)改為:
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
中應(yīng)改為:
Select a.id, b.yueshj from jh_wh_xiangmu a, jh_lr_zongliang b where trim(a.id)=trim(b.xiangmid(+))
11
.改好的存儲過程,不能編譯通過就認(rèn)為
ok
了。編譯通過只能說明在語法上沒有問題了,要進(jìn)一步執(zhí)行看邏輯上是否還有問題。在編譯時產(chǎn)生的錯誤是
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
;