Oracle 和 Sql service 區別


我主要用過的數據庫為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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM