Oracle與Sql Server差異點詳解
1、create函數或存儲過程異同點
Oracle 創建函數或存儲過程一般是 create or replace ……
SQL SERVER 則是在創建之前加一條語句,先判斷是否已經存在,如果存在刪除已有的函數或存儲過程。
函數語句:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[函數名]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[函數名] GO
存儲過程:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存儲過程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[存儲過程名] GO
2、結構異同點(在新建存儲過程的時候,語法格式上的差異)
ORACLE:
Create 部分 IS 定義部分 BEGIN … END; 實現部分
SQL SERVER:
Create 部分 AS 定義和實現部分 (AS 下麵的代碼一般用BEGIN … END 包含)
3、調用參數
ORACLE輸入參數 參數名In 參數類型 ORACLE輸出參數 參數名Out 參數類型 SQL SERVER輸入參數 參數名 參數類型 IN(IN可以不寫,係統默認) SQL SERVER輸出參數 參數名 參數類型 OUTPUT
4、變量命名及賦值
ORACLE:
1、變量名 隨便取 2、定義格式為 變量名 變量類型; 3、給變量賦值為 變量名 := 值;
SQL SERVER:
1、變量名前麵一般加@ 2、定義格式為 declare 變量名 變量類型 3、SET變量名 =變量類型
5、IF語句
ORACLE:
IF … THEN …. ELSE ... END IF;
SQL SERVER:
IF ... BEGIN …… END ELSE BEGIN …… END
或者
IF ... BEGIN …… END ELSE BEGIN …… END
6、遊標的定義及使用及循環操作
ORACLE定義遊標:
CURSOR CurA IS SELECT a FROM tab where … ;
SQL SERVER定義遊標:
DECLARE CurA CURSOR LOCAL FOR SELECT a FROM tab where … ;
ORACLE使用遊標:
Open CurA; -- 打開遊標 Fetch CurA Into ISUserUnitPri; IF CurA%NOTFOUND THEN -- 注:如果為CurA%FOUND,看下麵相同位置注釋 ISUserUnitPri := 1; END IF; Close CurA; -- 關閉遊標
SQL SERVER使用遊標:
Open CurA -- 打開遊標 Fetch next from CurA Into @ISUserUnitPri IF @@fetch_status <> 0 BEGIN -- 注: 則@@fetch_status = 0 SET @ISUserUnitPri = 1 -- 沒有選到記錄 給默認值1 END Close CurA -- 關閉遊標 DEALLOCATE CurA -- 釋放占用資源
ORACLE循環操作遊標 (超級簡潔):
FOR ISUserUnitPri IN CurA LOOP … –- 做操作 END LOOP; 注:想循環中間退出循環,用EXIT
SQL SERVER循環操作遊標:
Open CurA -- 打開遊標 Fetch next from CurA Into @ISUserUnitPri While ( @@fetch_status = 0 ) BEGIN …. –- 做操作 Fetch next from CurA Into @ISUserUnitPri END Close CurA -- 關閉遊標 DEALLOCATE CurA -- 釋放占用資源 注:想循環中間退出循環,用BREAK 注意: SQL SERVER 使用遊標完後,需要刪除遊標引用(DEALLOCATE cursor_name)。
7、計算時間差
ORACLE:
Oracle 兩個時間相減 得到一個以天為單位的帶小數的值,需要根據自己的需要再換算成秒值。 -- 這裏為 取START_QUEUE_TIME到當前時間的秒數 (SYSDATE - START_QUEUE_TIME)*24*60*60
SQL SERVER:
SQL SERVER兩個時間相減 得到還是時間(從1900-01-01 00:00:00.000開始的時間)。所以想得到以秒的時間差,這麼做就麻煩了。 SQL SERVER取時間差,專門有一個DATEDIFF函數,具體看SQL SERVER幫助。 -- 這裏為 取START_QUEUE_TIME到當前時間的秒數 DATEDIFF(second, START_QUEUE_TIME,GETDATE())
8、 top N 問題
在sql server中,top N 問題很容易解決,如下例:從表stbdbdj中選取排序後的第一行數據進行賦值。
在sql中解決方法很簡單,在select 後麵加上:top n 即可,其中 n 代表行數。
select top 1 @entrust_date = entrust_date, @entrust_no = entrust_no from run2k..stbdbdj where entrust_date = @date and entrust_no > @entrust_no_q and report_status = '1' order by entrust_date,entrust_no;
在oracle中,沒有top n這個命令,我們采取把兩層查詢方式解決:首先,把需要查找的字段值直接進行排序,然後在外麵進行第二次查詢,並使用rownum決定行數。
select entrust_date,entrust_no into @entrust_date, @entrust_no from ( select entrust_date,entrust_no from stbdbdj where entrust_date = @date and entrust_no > @entrust_no_q and report_status = '1' order by entrust_date,entrust_no ) where rownumber <=1 ;
9、如何解決結果集返回時,* 和變量同時存在的問題
下麵例子表示,在用遊標返回結果集時,同時返回一個變量的值,在sql server中代碼如下所示:
select a.*,b.organ_id from run2k..stbbp a,run2k..stkaccoarg b where a.date = @entrust_date and a.serial_no = @serial_no and a.branch_no = b.branch_no and a.exchange_type = b.exchange_type;
但在oracle中卻沒有這種用法,’*’後麵必需跟from。解決方法如下:
1)我們可以把 '*' 變成所需要選擇的字段,就是說采用表中需要顯示的全部字段表示*。
例如:
open p_cursor for select branch_no,...,organ_id where ...
2)如果這個字段或者說變量是從另外一張表中取出來的,同樣可以采用下麵的辦法。
open p_cursor for select a.*,b.organ_id; from stkaccoentrust a, stkaccoarg b where a.branch_no = b.branch_no and a.exchange_type = b.exchange_type and a.init_date = v_entrust_date and a.serial_no = v_serial_no;
10、用SQL SERVER裏CASE函數替換DECODE函數替換
ORACLE:
decode(client_status,'0','正常,'1','凍結','2','掛失','3','銷戶','未知');
SQLSERVER 沒有DECODE函數:
case client_status when '0' then '正常' when '1' then '凍結' when '2' then '掛失' when '3' then '銷戶' else '未知' end
注: 有趣的是 ORACLE的CASE函數,在SQL SERVER裏沒有找到替代的,隻好用IF ELSE 語句解決。
11、oracle的select … into問題
ORACLE裏直接取字段值,用select … into語法
select unit_id into unitid from call_user_table where user_id = ‘1231312’;
SQL SERVER直接取則直觀的多,直接等於就可以了
select @unitid = unit_id from call_user_table where user_id = ‘1231312’;
12、update語句中 表別名問題
因為有時候更新表時,需要從另一個表中更新數據,此處Oracle update語句可以給表起別名。但在SQL SERVER中update語句不允許用別名,但可以直接使用表明引用。如下:
oralce:
UPDATE A表 a SET a.name = ( select b.name from B表 b where b.id = a.id )
Sql server:
UPDATE A表 SET name = ( select B表.name from B表 where B表.id = A表.id )
本文來自百度文庫:點擊打開鏈接
最後更新:2017-04-03 20:19:19