閱讀889 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go DedeCMS後台經常無法加載編輯器
  下一篇:go Java中的Cookie(1)——基本操作