程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> sql server2000和oracle的存儲過程的區別

sql server2000和oracle的存儲過程的區別

編輯:Oracle數據庫基礎

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   ;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved