oracle与sqlserver差异,Oracle与SQLServer的SQL语法差异总结
Oracle與SQL Server應用差異對比分析 Oracle 10g 項目 存儲過程格式 存儲過程名(參數列表) IS Begin ---存儲過程內容 End 存儲過程名; 備注 CREATE OR REPLACE PROCEDURE CREATE PROCEDURE 存儲過程名 (參數列表) AS --存儲過程內容 SQLServer 2008 1、 指定參數類型,并要指定長度 2、 對于出參需要在類型后面加OUTPUT(或OUT) Eg: @task_remark VARCHAR(10) @prm_code int output 存儲過程參數 1、 指定參數類型,但不指定長度 2、 在參數及類型間要加入出標識(IN、OUT) Eg: task_remark IN VARCHAR2 prm_code OUT NUMBER 使用存儲過程 1、 直接使用存儲過程名 2、 參數在存儲過程后面的括號包內列出 Eg: p_wfm_getcolumns(v_tablename,v_tablecolumn); 1、 調用存儲過程名前面需要加 exec關鍵字 2、 參數在存儲過程后面逐個列出 3、 出參后面要加關鍵字output或out Eg: EXEC OUTPUT P_WFM_GETCOLUMNS @tablename,@tablecolumn 自定義函數格式 CREATE OR REPLACE FUNCTION CREATE FUNCTION 函數名 (參數函數名 (參數列表) RETURN 返回值類型 IS BEGIN END; 列表) RETURNs 返回值類型 AS --函數內容 自定義函數內容 1、 指定參數類型,但不指定長度 2、 在參數及類型間要加入出標識(IN、OUT) Eg: task_remark IN VARCHAR2 prm_code OUT NUMBER 1、 指定參數類型,并要指定長度 2、 不支持出參 Eg: @task_remark VARCHAR(10) 3、 支持對數據增、刪、改操作 4、 支持動態SQL語句 使用自定義函數 1、 直接使用函數名 Eg: V_result :=f_wfm_isandbegin(flow_id, step_id) 3、 不支持對數據增、刪、改操作 4、 不支持動態SQL語句 1、 在函數名前面加上dbo. Eg: Set @result= dbo.f_wfm_isandbegin(@flow_id, @step_id) 游標 1、 游標聲明 DECLARE cursor 游標名 is select語句 1、 游標聲明 DECLARE游標名cursor for select語句 2、 使用游標過程 打開(open)->提取(fetch)->關閉(close) 3、 支持快捷使用游標,直接使用for循環,數據庫會自動打開、提取及關閉游標 變量 1、 變量前不可加@符號 2、 存儲過程中變量聲明不需要declare Eg: Code varchar2(5); 2、 使用游標過程 打開(open)->提取(fetch)->關閉(close)->銷毀( 1、 變量前需要加@符號 2、 變量聲明需要使用Declare關鍵字 Eg: DECLARE @code varchar(5); 3、 變量類型可按表中字段類型動態定義 Eg: V_id sysc01.id%type; 賦值 3、 不支持按表字段類型動態定義 1、 變量直接賦值,變量 := 表達式; 1、 變量直接賦值,Set 變量=表達式; Eg: Eg: v_result := ‘abcd’; Set @result = ‘abcd’ 2、 通過SQL語句 2、 通過SQL語句賦值 Select 表達式 into 變量 from Select 變量=表達式 from 表 Eg: 表 Eg: Select Select code,name into @code=code,@name=name from v_code,v_name from sysc01 sysc01 where id = 1000 Where id = 1000 語句結束符 大小寫 序列 Select 語法 SQL語句使用分號 ; 作為語句的結束 Oracle對字符區分大小寫 1、 有序列sequence對象,無自動增長列 1、 結果集可做為表使用,使用時可不加別名 Eg: Select * from (select * from tab1) 2、 虛表 dual的使用,對于select計算某些與實體表無關的表達式時,要使用虛表dual Eg: Select round(1/3,2) from dual ; 3、 SQL語句不需要加分號;作為結束符(加也可) 默認對字符不區分大小寫,也可修改數據庫配置支持區分大小寫 1、 無序列對象,表中有自動增長列 1、 結果集可做為表使用,使用時必須加別名 Eg: Select * from (select * from tab1) a 2、 對于Select計算某些與實體表無關的表達式時,可使用不帶from的select語句 Eg: Select round(1/3,2) ; 3、 可關聯表更新 Eg: Update a set a.value = isnull(b.value,’’) 將a表中value 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 ) Delete語法 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 按ID更新成b表中的value值 刪除a表中ID值在b表中存在的記錄 不可關聯表刪除 可關聯表刪除 Eg: Eg: Delete a where exists (select b.id Delate a from b where a.id = b.id ) 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(1000); v_sql :=’ select count(*) from tablename’; execute immediate v_sql into n_count; 3、 動態存儲過程(帶入、出參) Eg: v_sql := 'begin p_test (:v1,:v2,:v3); end;' execute immediate v_sql using in v_code,in v_name,out v_result ; 1、 普通動態SQL語句 exec('update tab1 set column1 = 5') 或 exec sp_executesql N'select * from tableName' -- 字符串前一定要加N 用變量替換SQL語句 Declare @sql Nvarchar(1000) Set @sql='select * from tableName' exec sp_executesql @sql 2、 帶出參動態SQL語句 declare @count int declare @sqls nvarchar(4000) set @sqls='select @a=count(*) from tableName ' exec sp_executesql @sqls,N'@a int output',@count output 3、 動態存儲過程(帶入、出參) Eg: DECLARE @result VARCHAR(50); DECLARE @sql NVARCHAR(1000); DECLARE @para NVARCHAR(200); SET @sql = 'p_test @code,@name,@result output' SET @para = '@code varchar(10),@name varchar(10),@result varchar(50) output' EXEC sp_executesql 注:p_test為存儲過程名 @sql,@para,'001','',@result OUTPUT 注:p_test 為存儲過程名 張三TOP用法 1、在Oracle中采用偽列rownum 獲取結果集中排在前面的部分記錄 Eg: 返回結果集中前10條記錄 Select * from sysc01 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 ; 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、 流控制語句 流控制與表達式結構很相似,只是IF 條件表達式 {語句塊} Else {語句塊} End 如果語句塊中有多于1條SQL語句,則必須要使用begin … end 構造 1、 case表達式 同Oracle 2、不支持流控制 Case 用法
總結
以上是生活随笔為你收集整理的oracle与sqlserver差异,Oracle与SQLServer的SQL语法差异总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php根据分辨率跳转,使用PHP将分辨率
- 下一篇: mysql去掉两个最高分_数据分析系列