
Oracle与SQLServer的SQL语法差异总结.doc
6页Oracle 与 SQL Server应用差异对比分析项目Oracle 10gSQLServer 2008备注存储过CREATE OR REPLACE PROCEDURECREATE PROCEDURE 存 储 过 程 名程格式存储过程名 ( 参数列表 ) IS( 参数列表 ) ASBegin-- 存储过程内容--- 存储过程内容End 存储过程名 ;存储过1、 指定参数类型,但不指定长度1、 指定参数类型,并要指定长度程参数2、 在参数及类型间要加入出标识2、 对 于 出 参 需 要 在 类 型 后 面 加(IN、OUT)OUTPUT(或 OUT)Eg:Eg:task_remark IN VARCHAR2@task_remark VARCHAR(10)prm_code OUT NUMBER@prm_code int output使用存1、 直接使用存储过程名1、 调 用 存 储 过 程 名 前 面 需 要 加储过程exec 关键字2、 参数在存储过程后面的括号包2、 参数在存储过程后面逐个列出内列出3、 出参后面要加关键字 output 或outEg:Eg:p_wfm_getcolumns(v_tablenaEXEC P_WFM_GETCOLUMNSme,v tablecolumn);@tablename , @tablecolumnOUTPUT自定义CREATE OR REPLACE FUNCTIONCREATE FUNCTION 函数名 ( 参数函数格函数名 ( 参数列表 )列表 )式RETURN 返回值类型 ISRETURNs 返回值类型 ASBEGIN-- 函数内容END;自定义1、 指定参数类型,但不指定长度1、 指定参数类型,并要指定长度函数内2、 在参数及类型间要加入出标识2 、 不支持出参容(IN、OUT)Eg:Eg:task_remark IN VARCHAR2@task remark VARCHAR(10)prm_code OUT NUMBER3、 支持对数据增、删、改操作3、 不支持对数据增、删、改操作4、 支持动态 SQL语句4、 不支持动态 SQL语句使用自1、 直接使用函数名1、 在函数名前面加上 dbo.定义函Eg:Eg:数V result :=f wfm isandbegiSet @result=n(flow_id, step_id)dbo.f_wfm_isandbegin(@flow_id, @step id)游标1、 游标声明1、 游标声明DECLARE cursor 游标名 isDECLARE 游 标 名 cursor forselect 语句select 语句2、3、使用游标过程 打开 (open)-> 提 取(fetch)->关闭 (close) 支持快捷使用游标,直接使用 for 循环,数据库会自动打开、 提取及关闭游标2、使用游标过程 打开 (open)-> 提取 (fetch)-> 关闭 (close)->销毁 (变量1、变量前不可加 @符号1、变量前需要加 @符号2、存储过程中变量声明不需要2、变量声明需要使用 Declare 关键declare字Eg:Eg:Code varchar2 ( 5);DECLARE @code varchar(5) ;3、变量类型可按表中字段类型动态定义3、不支持按表字段类型动态定义Eg:V_id sysc01.id%type;赋值1、变量直接赋值 ,变量 := 表达式 ;1、变量直接赋值, Set 变量 =表达式 ;Eg:Eg:v_result := ‘abcd';Set @result = ‘abcd'2、通过 SQL语句2、通过 SQL语句赋值Select 表达式 into 变量 fromSelect 变量 =表达式 from 表表Eg:Eg:SelectSelect code,name into@code=code,@name=name fromv_code,v_name from sysc01sysc01 where id = 1000Where id = 1000语句结SQL 语句使用分号 ; 作为语句的结SQL 语句不需要加分号 ;作为结束符束符束(加也可)大小写Oracle 对字符区分大小写默认对字符不区分大小写, 也可修改数据库配置支持区分大小写序列1、有序列 sequence 对象,无自动 增长列1、无序列对象,表中有自动增长列Select1、结果集可做为表使用,使用时1、结果集可做为表使用,使用时必语法Eg:可不加别名Eg:须加别名Select * from (select * from tab1)Select * from (select * from tab1) a2、虚表 dual 的使用,对于 select2、对于 Select 计算某些与实体表无计算某些与实体表无关的表达关的表达式时,可使用不带 from式时,要使用虚表 dual的 select 语句Eg:Eg:Select round(1/3,2) from dual ;Select round(1/3,2) ;3、3、Update不可关联表更新可关联表更新将 a 表语法Eg:Eg:中For cur in (select a.id,b.value from aUpdate a set a.value = isnull(b.value, ') 'valueinner join b on a.id = b.id ) loopUpdate a set a.value = cur.valueWhere a.id = cur.id;End loop;或Update a set a.value = (select b.value From b where b.id = a.id )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按 更 成b 中 value 值ID 新 表 的Delete不可关联表删除可关联表删除删除a语法Eg:Eg:表中 IDDelete a where exists (select b.idDelate a值在bfrom b where a.id = b.id )From a表中Inner join b on a.id = b.id存在的记录动态1、 普通动态 SQL语句1、 普通动态 SQL语句SQL 语Beginexec('update tab1 set column1 = 5')句Execute immediate ‘update tab1 set或column1=5 ';exec sp_executesql N'select * fromEnd;tableName' -- 字符串前一定要加 N用变量替换 SQL语句用变量替换 SQL语句V_sql := ‘update tab1 set column1=5 'Declare @sql Nvarchar(1000)Execute immediate v_sql;Set @sql='select * from tableName'exec sp_executesql @sql2、 带出参动态 SQL语句2、 带出参动态 SQL语句n_count number(10);declare @count intv_sql varchar2(1000);declare @sqls nvarchar(4000)v_sql :=' select count(*) fromset @sqls='select @a=count(*) fromtablename ';tableName 'execute immediate v_sqlexec sp_executesql @sqls,N'@a intinto n_count;output',@count output3、 动态存储过程(带入、出参)3、 动态存储过程(带入、出参)Eg:Eg:v sql := 'begin p testDECLARE @result VARCHAR( 50);(:v1,:v2,:v3); end;'DECLARE @sql NVARCHAR( 1000 );execute immediate v_sqlDECLARE @para NVARCHAR( 200 );using in v code, inSET @sql = 'p_testv name, out v result ;@code,@name,@result output'注: p_test 为存储过程名SET @para = '@codevarchar(10),@namevarchar(10),@resultvarchar(50) output'EXEC sp executesql@sql , @para , '001' , ' 张 三 ' , @result OUTPUT 注: p test 为存储过程名TOP 用 法1、在 Oracle 中采用伪列 rownum 获 取结果集中排在前面的部分记录 Eg: 返回结果集中前 10 条记录 Select * from sysc01 where。












