Oracle与SQLServer的SQL语法差异总结.docx

上传人:jian****018 文档编号:10118618 上传时间:2020-04-10 格式:DOCX 页数:6 大小:57.67KB
返回 下载 相关 举报
Oracle与SQLServer的SQL语法差异总结.docx_第1页
第1页 / 共6页
Oracle与SQLServer的SQL语法差异总结.docx_第2页
第2页 / 共6页
Oracle与SQLServer的SQL语法差异总结.docx_第3页
第3页 / 共6页
点击查看更多>>
资源描述
Oracle与SQL Server应用差异对比分析项目Oracle 10gSQLServer 2008备注存储过程格式CREATE OR REPLACE PROCEDURE 存储过程名(参数列表) ISBegin -存储过程内容End 存储过程名;CREATE PROCEDURE 存储过程名 (参数列表) AS -存储过程内容存储过程参数1、 指定参数类型,但不指定长度2、 在参数及类型间要加入出标识(IN、OUT)Eg:task_remark IN VARCHAR2prm_code OUT NUMBER1、 指定参数类型,并要指定长度2、 对于出参需要在类型后面加OUTPUT(或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 函数名 (参数列表) RETURN 返回值类型 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 :=f_wfm_isandbegin(flow_id, step_id)1、 在函数名前面加上dbo.Eg:Set result=dbo.f_wfm_isandbegin(flow_id, step_id)游标1、 游标声明 DECLARE cursor 游标名 is select语句2、 使用游标过程 打开(open)-提取(fetch)-关闭(close)3、 支持快捷使用游标,直接使用for循环,数据库会自动打开、提取及关闭游标1、 游标声明DECLARE游标名cursor for select语句2、 使用游标过程 打开(open)-提取(fetch)-关闭(close)-销毁(变量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 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、 无序列对象,表中有自动增长列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语法不可关联表更新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.valueFrom 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将a表中value按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 set 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_sql using 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 nvarchar(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 varchar(50) outputEXEC sp_executesql sql,para,001,张三,result OUTPUT注:p_test 为存储过程名TOP用法1、在Oracle中采用伪列rownum 获取结果集中排在前面的部分记录Eg: 返回结果集中前10条记录Select * from sysc01 where rownum =10Rownum可使用、=符号,如果使用=号只可=12、Rownum列还常用于形成结果集的顺序号,从而可获取一定序号范围的行Eg: 获取按code排名第10到20行Select * from (Select a.*,rownum as nrow from 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 between 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 endEg:Select case when name=张三 then 1 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_number := 1;when v_name = 李四 then v_number:=2;else v_number:=0end case;1、 case表达式同Oracle2、不支持流控制临时表1、 临时表结构需要象实体表一样事先定义后再在SQL脚本中使用,临时表名与实体表名规则一样Eg:create temporary table WFMW02( paraid NUMBER(9), vvalue VARCHAR2(50), flowid NUMBER(9), id NUMBER(9)on commit delete rows;1、 临时表是在执行数据库脚本会话过程中创建并使用,临时表名前面带有#号(或#全局临时表)Eg:create table #WFMW02( paraid int, vvalue VARCHAR(50), flowid int, id int)临时表也可在使用过程中自动创建Select paraid,vvalue,flowid,id into #wfmw02 from wfmb01c 常用函数1、 nvl(表达式,表达式)2、 sysdate3、 instr(字符表达式1,字符表达式2 ,pos,nth)从“表达式1”的“pos”位置搜索第“nth”个“表达式2”的位置(若未找到则返回0)4、 To_char(),to_date(),to_number()1、 isnull(表达式,表达式)2、 getdate()3、 CHARINDEX(字符表达式1,字符表达式2 ,pos)从“表达式2”的“pos”位置搜索“表达式1”并返回“表达式1”的起始位置(若未找到则返回0)4、 convert(),cast()运算符字符相加 |Eg: A|B = AB字符相加 +Eg: A+B = ABnull对于字符型数据,空串等同于NULL对于字符型数据,空串 不同于null
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!