oracle数据转成sqlserver,oracle数据库转换到Sqlserver的几点经验
應廣大朋友的要求,本人將《PB-ORACLE通用開發框架2.1》版本的程序
成功轉換到SQLServer下,下面是我總結的幾條經驗,與大家分享,有不
1.數據類型的轉換? 建立兩個數據源basedb, basdb_sql
為每個表,建立一個數據管道,修改部分字段類型
Oracle????????????????????????????? SQLServer
varchar2??????????????????????????? varchar
blob??????????????????????????????? image
2.函數的轉換
ORACLE?????????????????????????????? SQLServer
to_char(readingdate,’yyyymm’)????? convert(char(6),readingdate,111)
to_char(readingdate,’yyyy/mm’)???? convert(char(7),readingdate,112)
decode( ,? ,? ,? ,)????????????????? case when then end 或者 isnull(x,0)
左右連接 (+)???????????????????????? left outer join
nvl(field1,'')?????????????????????? isnull(field1,'')
舉例子如下:
oracle:
SELECT EFMFID,
EFMMID,
EFMNAME,
EFMMETHOD,
EFMUPPICT,
EFMDNPICT,
EFMCHECK,
EFMVISIBLE,
EFMHINT,
EFMMICOHELP,
EFMTBITEMINDEX,
EFMTBITEMORDER,
EFMTBITEMSPACE,
DECODE(ORFMRID,NULL,'N','Y')? FLAG
FROM ERPFUNCMETHOD,
(SELECT ORFMRID,ORFMFID,ORFMETHOD
FROM OPERRFMETHOD WHERE ORFMRID=:v_role)
WHERE EFMFID=ORFMFID(+) AND EFMMID=ORFMETHOD(+) AND EFMFID=:v_func
ORDER BY EFMTBITEMORDER
-----------------------------------
sqlserver:
SELECT?? A.EFMFID,
A.EFMMID,
A.EFMNAME,
A.EFMMETHOD,
A.EFMUPPICT,
A.EFMDNPICT,
A.EFMCHECK,
A.EFMVISIBLE,
A.EFMHINT,
A.EFMMICOHELP,
A.EFMTBITEMINDEX,
A.EFMTBITEMORDER,
A.EFMTBITEMSPACE,
case IsNUll(B.ORFMRID,'*')
when '*' then 'N'
else 'Y'
end FLAG
FROM ERPFUNCMETHOD AS A
LEFT OUTER JOIN
(SELECT ORFMRID,ORFMFID,ORFMETHOD
FROM OPERRFMETHOD WHERE ORFMRID = :v_role ) AS B
ON A.EFMFID=B.ORFMFID AND A.EFMMID=B.ORFMETHOD
WHERE A.EFMFID = :v_func
ORDER BY A.EFMTBITEMORDER;
3. 數據窗口中的語法
在測試的過程會發現有一些數據窗口在 SqlServer不能用:修改方法是將字段的引號去掉
4. 取服務器時間
ORACEL
-------------------------------------------
datetime ld_today
declare cur cursor for select getdate();
open cur;
fetch cur into :ld_today;
close cur;
IF SQLCA.SQLCODE <> 0 THEN
MESSAGEBOX('錯誤信息', SQLCA.SQLERRTEXT)
END IF
return ld_today
SQLSERVER:
---------------------------------------------
date ld_today
SELECT SYSDATE INTO :Ld_TODAY FROM DUAL;
IF SQLCA.SQLCODE <> 0 THEN
MESSAGEBOX('錯誤信息', SQLCA.SQLERRTEXT)
END IF
return ld_today
5.函數的轉換
盡量不要使用select count(*),而由EXISTS 來代替
ORACEL
-------------------------------------------
CREATE OR REPLACE FUNCTION fChkRoleFunc
(Vrole IN VARCHAR2,vcode IN VARCHAR2)
Return Integer
AS
lpcode Integer;
BEGIN
SELECT COUNT(*) INTO lpcode FROM operrolefunc
WHERE orfrid=vrole AND orffid = vcode;
Return lpcode;
EXCEPTION WHEN OTHERS THEN
lpcode := 0;
Return lpcode;
END;
SQLSERVER:
---------------------------------------------
CREATE? FUNCTION fChkRoleFunc
(@Vrole? VARCHAR(2), @vcode? VARCHAR(10))
Returns Int
AS
BEGIN
DECLARE?? @lpcode Int
IF EXISTS(? SELECT *? FROM operrolefunc WHERE orfrid=@vrole? AND orffid = @vcode)
set @lpcode = 1
else
set? @lpcode = 0
RETURN (@lpcode)
END
6. 取本機IP
在ORACLE中是利用系統對象獲得
//登錄數據庫客戶端名稱
SELECT sys_context('USERENV','HOST')
INTO :gs_workstation
FROM dual;
gs_workstation=mid(gs_workstation,pos(gs_workstation,'/')+1,len(gs_workstation) - pos(gs_workstation,'/'))
//登錄數據庫客戶端IPSELECT sys_context('USERENV','IP_ADDRESS') INTO :gs_ws_ip FROM dual;在SQLServer版本是用winsock.pbl和pslib5.dll 完成的增加了一個函數f_ip_sock
總結
以上是生活随笔為你收集整理的oracle数据转成sqlserver,oracle数据库转换到Sqlserver的几点经验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 三层嵌套查询,oracle
- 下一篇: oracle反调试,突破前端反调试--阻