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