Oracle与SQLServer的SQL语法差异总结

上传人:平*** 文档编号:13360263 上传时间:2017-10-23 格式:DOCX 页数:6 大小:29.14KB
返回 下载 相关 举报
Oracle与SQLServer的SQL语法差异总结_第1页
第1页 / 共6页
Oracle与SQLServer的SQL语法差异总结_第2页
第2页 / 共6页
Oracle与SQLServer的SQL语法差异总结_第3页
第3页 / 共6页
Oracle与SQLServer的SQL语法差异总结_第4页
第4页 / 共6页
Oracle与SQLServer的SQL语法差异总结_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《Oracle与SQLServer的SQL语法差异总结》由会员分享,可在线阅读,更多相关《Oracle与SQLServer的SQL语法差异总结(6页珍藏版)》请在金锄头文库上搜索。

1、Oracle 与 SQL Server 应用差异对比分析项目 Oracle 10g SQLServer 2008 备注存储过程格式CREATE OR REPLACE PROCEDURE 存储过程名(参数列表 )ISBegin -存储过程内容End 存储过程名;CREATE PROCEDURE 存储过程名 (参数列表) AS -存储过程内容存储过程参数1、 指定参数类型,但不指定长度2、 在参数及类型间要加入出标识(IN、OUT)Eg:task_remark IN VARCHAR2prm_code OUT NUMBER1、 指定参数类型,并要指定长度2、 对于出参需要在类型后面加OUTPUT(或

2、 OUT)Eg:task_remark VARCHAR(10)prm_code int output使用存储过程1、 直接使用存储过程名2、 参数在存储过程后面的括号包内列出Eg: p_wfm_getcolumns(v_tablename,v_tablecolumn);1、 调用存储过程名前面需要加 exec 关键字2、 参数在存储过程后面逐个列出3、 出参后面要加关键字 output 或outEg:EXEC P_WFM_GETCOLUMNS tablename,tablecolumn OUTPUT自定义函数格式CREATE OR REPLACE FUNCTION 函数名 (参数列表)RETU

3、RN 返回值类型 ISBEGINEND;CREATE FUNCTION 函数名 (参数列表)RETURNs 返回值类型 AS-函数内容自定义函数内容1、 指定参数类型,但不指定长度2、 在参数及类型间要加入出标识(IN、OUT)Eg:task_remark IN VARCHAR2prm_code OUT NUMBER3、 支持对数据增、删、改操作4、 支持动态 SQL 语句1、 指定参数类型,并要指定长度2、 不支持出参Eg:task_remark VARCHAR(10)3、 不支持对数据增、删、改操作4、 不支持动态 SQL 语句使用自定义函数1、 直接使用函数名Eg:V_result :=

4、f_wfm_isandbegin(flow_id, step_id)1、 在函数名前面加上 dbo.Eg:Set result=dbo.f_wfm_isandbegin(flow_id, step_id)游标 1、 游标声明 DECLARE cursor 游标名 is 1、 游标声明DECLARE 游标名 cursor for select 语句2、 使用游标过程 打开(open)-提取(fetch)-关闭 (close)3、 支持快捷使用游标,直接使用for 循环,数据库会自动打开、提取及关闭游标select 语句2、 使用游标过程 打开(open)-提取(fetch)-关闭(close)-

5、销毁(变量 1、 变量前不可加符号2、 存储过程中变量声明不需要declare Eg:Code varchar2(5);3、 变量类型可按表中字段类型动态定义Eg:V_id sysc01.id%type;1、 变量前需要加符号2、 变量声明需要使用 Declare 关键字Eg:DECLARE code varchar(5);3、 不支持按表字段类型动态定义 赋值 1、 变量直接赋值,变量 := 表达式;Eg: v_result := abcd;2、 通过 SQL 语句Select 表达式 into 变量 from 表Eg:Select code,name into v_code,v_name

6、from sysc01 Where id = 10001、 变量直接赋值,Set 变量 =表达式;Eg: Set result = abcd2、 通过 SQL 语句赋值 Select 变量=表达式 from 表Eg:Select code=code,name=name from sysc01 where id = 1000语句结束符SQL 语句使用分号 ; 作为语句的结束SQL 语句不需要加分号;作为结束符(加也可)大小写 Oracle 对字符区分大小写 默认对字符不区分大小写,也可修改数据库配置支持区分大小写序列 1、 有序列 sequence 对象,无自动增长列1、 无序列对象,表中有自动

7、增长列Select 语法1、 结果集可做为表使用,使用时可不加别名Eg:Select * from (select * from tab1)2、 虚表 dual 的使用,对于 select计算某些与实体表无关的表达式时,要使用虚表 dualEg:Select round(1/3,2) from dual ;3、1、 结果集可做为表使用,使用时必须加别名Eg:Select * from (select * from tab1) a2、 对于 Select 计算某些与实体表无关的表达式时,可使用不带from 的 select 语句Eg:Select round(1/3,2) ;3、 Update语

8、法不可关联表更新Eg: 可关联表更新Eg:将 a 表中For cur in (select a.id,b.value from ainner 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.valueFrom b where b.id = a.id ) Update a set a.value = isnull(b.value,)From a inner join b on a.id = b.id

9、或Update a set a.value = isnull(b.value,)From b where a.id = b.idvalue按 ID更新成 b表中的value值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 删除 a表中ID 值在 b表中存在的记录 动态SQL 语句1、 普通动态 SQL 语句Begin Execute immediate update tab1 se

10、t column1=5;End;用变量替换 SQL 语句V_sql := update tab1 set column1=5Execute 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_sq

11、lusing in v_code,in v_name,out v_result ;注:p_test 为存储过程名1、 普通动态 SQL 语句exec(update tab1 set column1 = 5) 或exec sp_executesql Nselect * from tableName - 字符串前一定要加 N用变量替换 SQL 语句Declare sql Nvarchar(1000) Set sql=select * from tableNameexec sp_executesql sql 2、 带出参动态 SQL 语句declare count intdeclare sqls n

12、varchar(4000) set sqls=select a=count(*) from tableName exec sp_executesql sqls,Na 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 outputSET para = code varchar(10),name varchar(10),result v

13、archar(50) outputEXEC sp_executesql sql,para,001,张三,result OUTPUT注:p_test 为存储过程名TOP 用法1、在 Oracle 中采用伪列 rownum 获取结果集中排在前面的部分记录Eg: 返回结果集中前 10 条记录Select * from sysc01 where rownum 、=符号,如果使用= 号只可=12、 Rownum 列还常用于形成结果集的顺序号,从而可获取一定序号范围的行Eg: 获取按 code 排名第 10 到 20行Select * from (Select a.*,rownum as nrow fro

14、m tab01 a order by code) where nrow between 10 and 201、 SQLServer 中采购 top 方式获取结果集排在前面的部分记录Eg:返回结果集中前 10 条记录Select top 10 * from sysc012、 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 betwe

15、en 10 and 20IFElse流控制IF 条件表达式 then 语句块 Else 语句块 End if ;IF 条件表达式语句块 Else 语句块 End 如果语句块中有多于 1 条 SQL 语句,则必须要使用 begin end 构造Case 用法1、 表达式Case 表达式 when 匹配表达式 then 结果表达式 1 else 结果表达式 2 endEg:Select case name when 张三 then 1 when 李四 then 2 else 0 end From person或Case when 条件表达式 then 结果表达式 1 else 结果表达式 2 en

16、dEg:Select case when name=张三 then 1、 case 表达式同 Oracle1 when name=李四 then 2 else 0 end From person2、 流控制语句流控制与表达式结构很相似,只是结果表达式换成语句块Case 表达式 when 匹配表达式 then 语句块 1 else 语句块 2 end case;Eg:case v_name when 张三 thenv_number := 1;when 李四 then v_number:=2;else v_number:=0end case;或Case when 条件表达式 then 语句块 1 else 语句块 2 end case;Eg:case when v_name = 张三 thenv

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号