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