Oracle 和 Sql service 區別

我主要用過的數據庫爲Oracle10g和SqlServer2008,經過實際運用和查閱資料整理以下:sql

主題數據庫

Oracle 10gide

SQLServer 2008函數

存儲過程格式oop

Create Or Replace Procedure 存儲過程名 (參數列表)sqlserver

ISfetch

Begincode

     ---存儲過程內容server

End 存儲過程名;對象

Create Procedure 存儲過程名  (參數列表)

AS

Begin

    --存儲過程內容

End

 

存儲過程參數

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

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

eg:  param  in  int

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

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

eg:  @param  nvarchar(10)  out

使用存儲過程

一、直接使用存儲過程名;

二、在存儲過程後面的括號內列出參數;

eg:  proc_GetList (param1 , param2);

一、關鍵字Exec,存儲過程名;

二、參數在存儲過程後面逐個列出,輸出參後面要加輸出標識(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

自定義函數內容

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

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

eg:  param  in  int

三、支持對數據增、刪、改操做

四、支持動態SQL語句

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

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

eg:  @param  nvarchar(10)  out

三、不支持對數據增、刪、改操做

四、不支持動態SQL語句

使用自定義函數

一、直接使用函數名名稱

eg:  result  := func_isandbegin(flow_id, step_id)

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

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

遊標

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

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

三、支持快捷使用遊標,直接使用for循環,數據庫會自動打開、提取及關閉遊標

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

二、使用遊標過程   打開(open)->提取(fetch)->關閉(close)->銷燬

變量

一、變量前不可加@符號;

二、存儲過程當中變量聲明不須要declare;

eg:  param  nvarchar(5);

三、 變量類型可按表中字段類型動態定義

eg:   _id    tableName.id%type;

 

一、變量前須要加@符號;

二、變量聲明須要使用Declare關鍵字;

eg:  Declare  @param nvarchar(5);

三、不支持按表字段類型動態定義  

 

賦值

一、變量直接賦值,變量 := 表達式;

eg:  result := 'abcd';

二、經過SQL語句 : Select 表達式 into 變量 from 表

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

一、變量直接賦值,Set 變量 = 表達式;

eg:  Set @result = 'abcd'

二、經過SQL語句賦值 : Select 變量 = 表達式 from 表

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

語句結束符

SQL語句使用分號 ; 做爲語句的結束

SQL語句不須要加分號;做爲結束符(加也可)

大小寫

Oracle對字符區分大小寫

默認對字符不區分大小寫,也可修改數據庫配置支持區分大小寫

序列

一、有序列sequence對象,無自動增加列

一、 無序列對象,表中有自動增加列 identity(1,1)

Select 語法

一、結果集可作爲表使用,使用時可不加別名

eg:  Select * from (select * from tab1)

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

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

一、結果集可作爲表使用,使用時必須加別名

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

二、對於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語句

一、普通動態SQL語句

Begin

Execute immediate 'update tab1 set   column1=5';

End;

用變量替換SQL語句

V_sql := ‘update tab1 set column1=5’

Execute immediate v_sql;

 

 

二、 帶出參動態SQL語句

n_count number(10);

v_sql varchar2(max);

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

execute immediate v_sql  into  n_count;

 

三、動態存儲過程(帶入、出參)

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爲存儲過程名

一、普通動態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

 

二、 帶出參動態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

 

三、動態存儲過程(帶入、出參)

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用法

一、在Oracle中採用僞列rownum 獲取結果集中排在前面的部分記錄

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

Select * from tableName where rownum <=10

Rownum可以使用<、<=符號,不可以使用>、>=符號,若是使用=號只可=1

二、Rownum列還經常使用於造成結果集的順序號,從而可獲取必定序號範圍的行

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

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

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

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

Select    top 10 * from sysc01

 

二、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 用法

一、表達式 : 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

二、流控制語句

流控制與表達式結構很類似,只是結果表達式換成語句塊

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;

一、  case表達式

同Oracle

 

 

 

 

 

 

 二、不支持流控制

臨時表

一、臨時表結構須要象實體表同樣事先定義後再在SQL腳本中使用,臨時表名與實體表名規則同樣

eg:

create temporary table WFMW02

( paraid number(9),

  vvalue nvarchar2(50),

  flowid number(9),

  id     number(9))

on commit delete rows;

一、  臨時表是在執行數據庫腳本會話過程當中建立並使用,臨時表名前面帶有#號(或##全局臨時表)

eg:

create table #WFMW02

( paraid int,

  vvalue nvarchar(50),

  flowid int,

  id     int)

臨時表也可在使用過程當中自動建立

Select paraid,vvalue,flowid,id

into #wfmw02

from wfmb01c

經常使用函數

一、nvl(表達式1,表達式2); --表達式1爲空返回表達式2

二、sysdate  --系統時間

三、instr(字符表達式1,字符表達式2 [,pos][,nth])

從「表達式1」的「pos」位置搜索第「nth」個「表達式2」的位置(若未找到則返回0)

四、To_char(),to_date(),to_number()

一、isnull(表達式1,表達式2)

二、getdate()

三、CHARINDEX(字符表達式1,字符表達式2 [,pos])

從「表達式2」的「pos」位置搜索「表達式1」並返回「表達式1」的起始位置(若未找到則返回0)

四、convert(),cast()

運算符

字符相加 ||

eg:     'A' || 'B' = 'AB'

字符相加 +

eg:     'A' + 'B' = 'AB'

null

對於字符型數據,空串等同於NULL

對於字符型數據,空串不一樣於null

相關文章
相關標籤/搜索