1、對於有返回單值的MSSQL存儲過程,在數據庫移值最好轉換成ORALCE的函數;
對於MSSQL有大量數據的處理而又不需返回值的存儲過程轉換成Oracle的過程
2、在T-SQL中,輸入、輸出參數定義部分在“CREATE…”和“AS”之間,前後
沒有括號;而在PL/SQL中必須有“(”和“)”與其他語句隔開。
3、在T-SQL中,聲明局部變量時,前面要有DECLARE關鍵字;
而在PL/SQL中不用DECLARE關鍵字。
4、在T-SQL中,參數名的第一個字符必須是“@”,並符合標識符的規定;
而在PL/SQL中,參數名除符合標識符的規定外沒有特殊說明
5 、Oracle存儲過程中不能直接執行DDL語句,除非用動態SQL執行。
6、oracle中的臨時表與SQL SERVER中的有很大差異。Oracle中的臨時表可以理解為是數據是臨時的,但表結構是在建立存儲過程前就已建好了的。
7 、if exists (select * from #temp1 where famount <> 0 )這樣的語句在Oracle中不支持,exists只能出現在where子句中。
8 、 oracle與SQL SERVER的存儲過程語法差異比較大,如Oracle中的if必須是
if <條件表達式> then
<PL/SQL塊>
{elsif <條件表達式> then
<PL/SQL塊>}
[else
<PL/SQL塊>]
end if;
9 、在sql server中''與NULL是不同的,但在Oracle中''就是NULL。
在sql server中一般是隱式事務自動提交,但在Oracle中缺省是需要顯式提交。
在Oracle中調用過程不需要加exec。
在Oracle中不支持update ... from ...,也不支持delete ... from
在Oracle中字符串自動轉為日期所使用的格式是由參數NLS_DATE_FORMAT設定的,不如sql server那麼靈活。
例子:將這個存儲過程改寫成Oracle
Create procedure P_GLBalanceWithOtherSys
@FEntityNo varchar(12),
@FYear int,
@FPeriod int
as
declare @ret int,
@sret char(1)
--跟現金系統對帳
if (select Fvalue from t_sysparam
where fentityno = @FEntityNo and FSysNo = 'Csh' and
FParamNo = 'CshStartFlag') = '1'
begin
create table #temp1 (famount decimal(18,2))
insert into #temp1
select abs(sum(a.FBeginAmountOrg)-sum(b.FBeginAmount)) +
abs(sum(a.FCreditAmountOrg)-sum(b.FCreditAmount)) +
abs(sum(a.FDebitAmountOrg)-sum(b.FDebitAmount)) +
abs(sum(a.FEndAmountOrg)-sum(b.FEndAmount))
from t_GLBal a,t_CshBal b
where a.fentityno = b.fentityno and a.FYear = b.FYear and
a.FPeriod = b.FPeriod and a.FAcctNo = b.FAcctNo and
a.FCurrency = b.FCurrency and a.FStatus = '0' and
a.fentityno = @FEntityNo
group by a.fentityno,a.FYear,a.FPeriod,a.FAcctNo,a.FCurrency
if exists (select * from #temp1 where famount <> 0 )
begin
raiserror('跟現金系統對帳不平!',18,1)
return -1
end
drop table #temp1
end
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Create or replace procedure P_GLBalanceWithOtherSys(
FEntityNo in varchar2,
FYear in number,
FPeriod in number )
as
ret number ;
sret char(1) ;
num char(1) ;
begin
select Fvalue into num
from t_sysparam
where fentityno = FEntityNo and FSysNo = 'Csh' and FParamNo = 'CshStartFlag' ;
if num = '1' then
create table temp1 (famount decimal(18,2)) ;
insert into temp1
select abs(sum(a.FBeginAmountOrg)-sum(b.FBeginAmount)) +
abs(sum(a.FCreditAmountOrg)-sum(b.FCreditAmount)) +
abs(sum(a.FDebitAmountOrg)-sum(b.FDebitAmount)) +
abs(sum(a.FEndAmountOrg)-sum(b.FEndAmount))
from t_GLBal a,t_CshBal b
where a.fentityno = b.fentityno and a.FYear = b.FYear and
a.FPeriod = b.FPeriod and a.FAcctNo = b.FAcctNo and
a.FCurrency = b.FCurrency and a.FStatus = '0' and
a.fentityno = FEntityNo
group by a.fentityno,a.FYear,a.FPeriod,a.FAcctNo,a.FCurrency ;
select count(*) into num from temp1 where famount <> 0 ;
if num > 0 then
raiserror('aaaaa',18,1) ;
return -1 ;
end if ;
drop table temp1 ;
end if ;
end P_GLBalanceWithOtherSys ;