Oracle 與 SqlServer 的區別淺析總結

來源:互聯網
上載者:User

標籤:style   io   os   ar   使用   for   strong   sp   資料   

  我主要用過的資料庫為Oracle10g和SqlServer2008,通過實際運用和查閱資料整理如下:

主題

Oracle 10g

SQLServer 2008

預存程序格式

Create Or Replace Procedure 預存程序名 (參數列表)

IS

Begin

     ---預存程序內容

End 預存程序名;

Create Procedure 預存程序名  (參數列表)

AS

Begin

    --預存程序內容

End

 

預存程序參數

1、指定參數類型,但不指定長度;

2、在參數及類型間要加入輸入輸出標識(in 、out);

eg:  param  in  int

1、指定參數類型,並指定長度;

2、輸出參數需要在類型後面加輸出標識(output 或 out)

eg:  @param  nvarchar(10)  out

使用預存程序

1、直接使用預存程序名;

2、在預存程序後面的括弧內列出參數;

eg:  proc_GetList (param1 , param2);

1、關鍵字Exec,預存程序名;

2、參數在預存程序後面逐個列出,輸出參後面要加輸出標識(output 或 out);

eg:  Exec proc_GetList  @param1, @param2 out

自訂函數格式

Create  Or  Replace  Function  函數名 (參數列表)

Return  傳回值  --可為參數  或類型(nvarchar(10))

Is

Begin

    --函數內容

End

Create  Function 函數名 (參數列表)

Returns  傳回值類型

AS

Begin

    --函數內容

End

自訂函數內容

1、指定參數類型,但不指定長度;

2、在參數及類型間要加入輸入輸出標識(in 、out);

eg:  param  in  int

3、支援對資料增、刪、改操作

4、支援動態SQL語句

1、指定參數類型,並指定長度;

2、輸出參數需要在類型後面加輸出標識(output 或 out)

eg:  @param  nvarchar(10)  out

3、不支援對資料增、刪、改操作

4、不支援動態SQL語句

使用自訂函數

1、直接使用函數名名稱

eg:  result  := func_isandbegin(flow_id, step_id)

1、在函數名前面加上dbo.

eg:  Set   @result = dbo.func_isandbegin(@flow_id,   @step_id)

遊標

1、遊標聲明  Declare Cursor 遊標名 is select語句

2、使用遊標過程   開啟(open)->提取(fetch)->關閉(close)

3、支援快捷使用遊標,直接使用for迴圈,資料庫會自動開啟、提取及關閉遊標

1、遊標聲明  Declare 遊標名 cursor  for   select語句

2、使用遊標過程   開啟(open)->提取(fetch)->關閉(close)->銷毀

變數

1、變數前不可加@符號;

2、預存程序中變數聲明不需要declare;

eg:  param  nvarchar(5);

3、 變數類型可按表中欄位類型動態定義

eg:   _id    tableName.id%type;

 

1、變數前需要加@符號;

2、變數聲明需要使用Declare關鍵字;

eg:  Declare  @param nvarchar(5);

3、不支援按表欄位類型動態定義  

 

賦值

1、變數直接賦值,變數 := 運算式;

eg:  result := ‘abcd‘;

2、通過SQL語句 : Select 運算式 into 變數 from 表

eg:  Select code,name into _code,_name   from tableName  where id = 10;

1、變數直接賦值,Set 變數 = 運算式;

eg:  Set @result = ‘abcd‘

2、通過SQL語句賦值 : Select 變數 = 運算式 from 表

eg:  Select @code=code,@name=name from   tablename where id = 10

語句結束符

SQL語句使用分號 ; 作為語句的結束

SQL語句不需要加分號;作為結束符(加也可)

大小寫

Oracle對字元區分大小寫

預設對字元不區分大小寫,也可修改資料庫配置支援區分大小寫

序列

1、有序列sequence對象,無自動成長列

1、 無序列對象,表中有自動成長列 identity(1,1)

Select 文法

1、結果集可做為表使用,使用時可不加別名

eg:  Select * from (select * from tab1)

2、虛表 dual的使用,對於select計算某些與實體表無關的運算式時,要使用虛表dual

eg:  Select   round(1/3,2) from dual ;  

1、結果集可做為表使用,使用時必須加別名

Eg: Select * from (select * from tab1) a

2、對於Select計算某些與實體表無關的運算式時,可使用不帶from的select語句

eg: Select round(1/3,2) ; 

Update文法

不可關聯表更新

eg:

For cur in (select a.id,b.value from a

   inner   join b on a.id = b.id ) loop

   Update   a set a.value = cur.value

   Where   a.id = cur.id;

End loop;

Update a set a.value = (select b.value

From b where b.id = a.id )

可關聯表更新

Eg:

Update a set a.value = isnull(b.value,‘‘)

From a

inner join b on a.id = b.id

 

Update a set a.value = isnull(b.value,‘‘)

From b where a.id = b.id

Delete文法

不可關聯表刪除

eg: Delete a where exists (select b.id from b   where a.id = b.id )

可關聯表刪除

eg:  Delate a  From a  Inner join b on a.id = b.id

動態SQL語句

1、普通動態SQL語句

Begin

Execute immediate ‘update tab1 set   column1=5‘;

End;

用變數替換SQL語句

V_sql := ‘update tab1 set column1=5’

Execute immediate v_sql;

 

 

2、 帶出參動態SQL語句

n_count number(10);

v_sql varchar2(max);

v_sql :=‘ select count(*) from tablename ‘;

execute immediate v_sql  into  n_count;

 

3、動態儲存裝置過程(帶入、出參)

v_sql := ‘begin  proc_test   (:v1,:v2,:v3); end;‘

execute immediate v_sql

using in v_code,in v_name,out v_result ;

註:proc_test為預存程序名

1、普通動態SQL語句

exec(‘update tab1 set column1 = 5‘)

exec sp_executesql N‘select * from   tableName‘ -- 字串前一定要加N

用變數替換SQL語句

Declare @sql Nvarchar(max)

Set @sql=‘select * from tableName‘

exec sp_executesql @sql

 

2、 帶出參動態SQL語句

declare @count int

declare @sqls nvarchar(max)

set @sqls=‘select @a=count(*) from   tableName ‘

exec sp_executesql @sqls,N‘@a int   output‘,@count output

 

3、動態儲存裝置過程(帶入、出參)

Declare  @result nvarchar(50),

             @sql nvarchar(max),

             @para nvarchar(200);

Set @sql = ‘proc_test   @code,@name,@result output‘

Set @para = ‘@code nvarchar(10),@name  nvarchar(10),@result nvarchar(50) output‘

EXEC sp_executesql @sql,@para,‘001‘,‘張三‘,@result OUTPUT

註:proc_test 為預存程序名

TOP用法

1、在Oracle中採用偽列rownum 擷取結果集中排在前面的部分記錄

eg: 返回結果集中前10條記錄

Select * from tableName where rownum <=10

Rownum可使用<、<=符號,不可使用>、>=符號,如果使用=號只可=1

2、Rownum列還常用於形成結果集的順序號,從而可擷取一定序號範圍的行

eg: 擷取按code排名第10到20行

Select * from (Select a.*,rownum as nrow   from tab01 a order by code) where nrow between 10 and 20

1、SQLServer中採用top方式擷取結果集排在前面的部分記錄

Eg:返回結果集中前10條記錄

Select    top 10 * from sysc01

 

2、sqlserver可通過ROW_NUMBER()次序函數實現

eg: 擷取按code排名第10到20行

Select a.* From (Select a.*, ROW_NUMBER() OVER( Order By a.code ) As nrow From tab01  a) a where nrow between 10   and 20

IF…

Else

流量控制

IF 條件運算式 then

  {語句塊}

Else

  {語句塊}

End if ;

 

IF 條件運算式

  {語句塊}

Else

  {語句塊}

End

如果語句塊中有多於1條SQL語句,則必須要使用begin … end 構造

Case 用法

1、運算式 : Case 運算式 when 匹配運算式 then 結果運算式1 else 結果運算式2 end

eg:

Select case name when ‘張三‘ then 1 when ‘李四‘ then 2 else 0   end

From person

或  Case when 條件運算式 then 結果運算式1 else 結果運算式2 end

eg:

Select case when name=‘張三‘ then 1 when name=‘李四‘ then 2 else 0   end

From person

2、流量控制語句

流量控制與運算式結構很相似,只是結果運算式換成語句塊

Case 運算式 when 匹配運算式 then {語句塊1} else {語句塊2} end case;

eg:

case v_name  when ‘張三‘ then  v_number := 1; when ‘李四‘ then v_number:=2;

else

v_number:=0  end case;

或  Case when 條件運算式 then {語句塊1} else {語句塊2} end case;

eg:

case  when v_name = ‘張三’ then  v_number := 1;  when v_name = ‘李四’ then

v_number:=2;

else  v_number:=0  end case;

1、  case運算式

同Oracle

 

 

 

 

 

 

 2、不支援流量控制

暫存資料表

1、暫存資料表結構需要象實體表一樣事先定義後再在SQL指令碼中使用,暫存資料表名與實體表名規則一樣

eg:

create temporary table WFMW02

( paraid number(9),

  vvalue nvarchar2(50),

  flowid number(9),

  id     number(9))

on commit delete rows;

1、  暫存資料表是在執行資料庫指令碼會話過程中建立並使用,暫存資料表名前面帶有#號(或##全域暫存資料表)

eg:

create table #WFMW02

( paraid int,

  vvalue nvarchar(50),

  flowid int,

  id     int)

暫存資料表也可在使用過程中自動建立

Select paraid,vvalue,flowid,id

into #wfmw02

from wfmb01c

常用函數

1、nvl(運算式1,運算式2); --運算式1為空白返回運算式2

2、sysdate  --系統時間

3、instr(字元運算式1,字元運算式2 [,pos][,nth])

從“運算式1”的“pos”位置搜尋第“nth”個“運算式2”的位置(若未找到則返回0)

4、To_char(),to_date(),to_number()

1、isnull(運算式1,運算式2)

2、getdate()

3、CHARINDEX(字元運算式1,字元運算式2 [,pos])

從“運算式2”的“pos”位置搜尋“運算式1”並返回“運算式1”的起始位置(若未找到則返回0)

4、convert(),cast()

運算子

字元相加 ||

eg:     ‘A‘ || ‘B‘ = ‘AB‘

字元相加 +

eg:     ‘A‘ + ‘B‘ = ‘AB‘

null

對於字元型資料,空串等同於NULL

對於字元型資料,空串不同於null

Oracle 與 SqlServer 的區別淺析總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.