Oracle 与 SqlServer 的区别浅析总结
我主要用过的数据库为Oracle10g和SqlServer2008,通过实际运用和查阅资料整理如下:
主题 |
Oracle 10g |
SQLServer 2008 |
存储过程格式 |
Create Or Replace Procedure 存储过程名 (参数列表) IS Begin ---存储过程内容 End 存储过程名; |
Create Procedure 存储过程名 (参数列表) AS Begin --存储过程内容 End |
存储过程参数 |
1、指定参数类型,但不指定长度; 2、在参数及类型间要加入输入输出标识(in 、out); eg: param in int |
1、指定参数类型,并指定长度; 2、输出参数需要在类型后面加输出标识(output 或 out) eg: @param nvarchar(10) out |
使用存储过程 |
1、直接使用存储过程名; 2、在存储过程后面的括号内列出参数; eg: proc_GetList (param1 , param2); |
1、关键字Exec,存储过程名; 2、参数在存储过程后面逐个列出,输出参后面要加输出标识(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 |
自定义函数内容 |
1、指定参数类型,但不指定长度; 2、在参数及类型间要加入输入输出标识(in 、out); eg: param in int 3、支持对数据增、删、改操作 4、支持动态SQL语句 |
1、指定参数类型,并指定长度; 2、输出参数需要在类型后面加输出标识(output 或 out) eg: @param nvarchar(10) out 3、不支持对数据增、删、改操作 4、不支持动态SQL语句 |
使用自定义函数 |
1、直接使用函数名名称 eg: result := func_isandbegin(flow_id, step_id) |
1、在函数名前面加上dbo. eg: Set @result = dbo.func_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: param nvarchar(5); 3、 变量类型可按表中字段类型动态定义 eg: _id tableName.id%type; |
1、变量前需要加@符号; 2、变量声明需要使用Declare关键字; eg: Declare @param nvarchar(5); 3、不支持按表字段类型动态定义 |
赋值 |
1、变量直接赋值,变量 := 表达式; eg: result := 'abcd'; 2、通过SQL语句 : Select 表达式 into 变量 from 表 eg: Select code,name into _code,_name from tableName where id = 10; |
1、变量直接赋值,Set 变量 = 表达式; eg: Set @result = 'abcd' 2、通过SQL语句赋值 : Select 变量 = 表达式 from 表 eg: Select @code=code,@name=name from tablename where id = 10 |
语句结束符 |
SQL语句使用分号 ; 作为语句的结束 |
SQL语句不需要加分号;作为结束符(加也可) |
大小写 |
Oracle对字符区分大小写 |
默认对字符不区分大小写,也可修改数据库配置支持区分大小写 |
序列 |
1、有序列sequence对象,无自动增长列 |
1、 无序列对象,表中有自动增长列 identity(1,1) |
Select 语法 |
1、结果集可做为表使用,使用时可不加别名 eg: Select * from (select * from tab1) 2、虚表 dual的使用,对于select计算某些与实体表无关的表达式时,要使用虚表dual eg: Select round(1/3,2) from dual ; |
1、结果集可做为表使用,使用时必须加别名 Eg: Select * from (select * from tab1) a 2、对于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语句 |
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(max); v_sql :=' select count(*) from tablename '; execute immediate v_sql into n_count; 3、动态存储过程(带入、出参) 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为存储过程名 |
1、普通动态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 2、 带出参动态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 3、动态存储过程(带入、出参) 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用法 |
1、在Oracle中采用伪列rownum 获取结果集中排在前面的部分记录 eg: 返回结果集中前10条记录 Select * from tableName 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 ; |
IF 条件表达式 {语句块} Else {语句块} End 如果语句块中有多于1条SQL语句,则必须要使用begin … end 构造 |
Case 用法 |
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、流控制语句 流控制与表达式结构很相似,只是结果表达式换成语句块 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; |
1、 case表达式 同Oracle 2、不支持流控制 |
临时表 |
1、临时表结构需要象实体表一样事先定义后再在SQL脚本中使用,临时表名与实体表名规则一样 eg: create temporary table WFMW02 ( paraid number(9), vvalue nvarchar2(50), flowid number(9), id number(9)) on commit delete rows; |
1、 临时表是在执行数据库脚本会话过程中创建并使用,临时表名前面带有#号(或##全局临时表) eg: create table #WFMW02 ( paraid int, vvalue nvarchar(50), flowid int, id int) 临时表也可在使用过程中自动创建 Select paraid,vvalue,flowid,id into #wfmw02 from wfmb01c |
常用函数 |
1、nvl(表达式1,表达式2); --表达式1为空返回表达式2 2、sysdate --系统时间 3、instr(字符表达式1,字符表达式2 [,pos][,nth]) 从“表达式1”的“pos”位置搜索第“nth”个“表达式2”的位置(若未找到则返回0) 4、To_char(),to_date(),to_number() |
1、isnull(表达式1,表达式2) 2、getdate() 3、CHARINDEX(字符表达式1,字符表达式2 [,pos]) 从“表达式2”的“pos”位置搜索“表达式1”并返回“表达式1”的起始位置(若未找到则返回0) 4、convert(),cast() |
运算符 |
字符相加 || eg: 'A' || 'B' = 'AB' |
字符相加 + eg: 'A' + 'B' = 'AB' |
null |
对于字符型数据,空串等同于NULL |
对于字符型数据,空串不同于null |
Oracle 与 SqlServer 的区别浅析总结的更多相关文章
- oracle与sqlserver部分区别
oracle和sqlserver的区别:1,执行修改操作要接commit,不然数据仅仅只是查看,并不是提交数据2,oracle不能使用select 字段 这种查看方式查看数据:3,oracle存储过程 ...
- Oracle/Mysql/SqlServer函数区别
mysql日期和时间格式转换 Linux scp 使用详解 Oracle/Mysql/SqlServer函数区别 2011-07-01 12:34:36| 分类: Mysql技术 | 标签:mys ...
- Oracle、SqlServer——基础知识——oracle 与 SqlServer 的区别(未完工)
一. oracle 与 SqlServer 的区别: 类别 oracle SqlServer 连接字符串 || + 变量 变量名 @变量名 初始赋值 := = SQL语句赋值 into = 绑定变量 ...
- MySQL、Oracle、SqlServer的区别
鉴于和数据库打交道日益频繁,遂决定写一篇关于Oracle.SqlServer.MySQL区别的个人观点. MySQL是大学时的主要学习对象,但刚参加工作时转到了SqlServer,现在主要接触的是Or ...
- 如何将两个字段合成一个字段显示(oracle和sqlserver的区别)
oracle中,如何将两个字段数据合并成一个字段显示,接下来看一下在sql server和pl/sql的区别 sql server中如何合并(用Cast()函数) --1.创建模拟的数据表--- cr ...
- Oracle 和 SqlServer 的区别
--sql server 与 oracle的区别: --DBMS 数据库管理系统--1.数据类型不同. --sql server 的数据类型:int ,smallint ,char,var ...
- 你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗
ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性: Oracle.MYSQL与DB2可在所有主流平台上运行: SQL Server只能在Windows下运行: --安 ...
- NUll在oracle与sqlserver中使用相同与区别
最近在使用Oracle进行开发,遇到很多与以前使用sqlserver的不同语法.今天遇到null在两种数据库上面操作上的差别,在此记录两种数据库上的差异. null 与字符串相加 1.在oracle中 ...
- CTE在Oracle和Sqlserver中使用的差异
CTE是一个很好用的工具,他可以帮助我们清晰代码结构,减少临时表使用,同时oracle和sqlserver都提供支持.但在oracle和sqlserver中使用CTE也存在一定区别. Oracle使用 ...
随机推荐
- 基于Landmark的人脸对齐以及裁剪方法
利用Landmarks进行人脸对齐裁剪是人脸检测中重要的一个步骤.效果如下图所示: 基本思路为: a.人脸检测 人脸的检测不必多说了,基本Cascade的方式已经很不错了,或者用基于HOG/FHOG的 ...
- UploadFileUtil
package cn.tz.util.file; import java.io.File; import java.io.FileOutputStream; import java.io.InputS ...
- 【scrapy】使用方法概要(一)(转)
[请初学者作为参考,不建议高手看这个浪费时间] 工作中经常会有这种需求,需要抓取互联网上的数据.笔者就经常遇到这种需求,一般情况下会临时写个抓取程序,但是每次遇到这种需求的时候,都几乎要重头写,特别是 ...
- 解决win8内置管理员无法激活此应用
解决win8内置管理员无法激活此应用 方法/步骤 在运行中输入:“gpedit.msc”,就会启动组策略编辑器. 依次展开“计算机配置”里面的 “Windows设置” “安全设置” “本地策略 ...
- MySQL数据库事务各隔离级别加锁情况--Repeatable Read && MVCC(转)
本文转自https://m.imooc.com/article/details?article_id=17289 感谢作者 上节回顾 上两篇记录了我对MySQL 事务 隔离级别read uncommi ...
- 计算一元一次方程Y=kX+b
开发过程中用不到一元一次方程吗?非也,iOS开发中经常会遇到根据某个ScrollView动态偏移量的值来实时设置一个View的透明度,你敢说你不用一元一次方程你能搞定? 想把一个动画效果做好,经常会遇 ...
- jquery实现上线翻滚效果公告
//样式文件: <style type="text/css"> * { margin:; padding:; } .scrollNews { width: 100%; ...
- dwr3实现消息精确推送详细步骤
最近项目中需要用到推送消息,找了很久终于找到一篇不错的文章,方便以后查看就转载了,也分享给大家,希望能帮到有需要的人. 第一.在项目中引入dwr.jar,然后在web.xml中进行配置,配置如下: & ...
- VMware虚拟机的三种联网方法及原理
VMware虚拟机的三种联网方法及原理 博客分类: 操作系统 虚拟机Vmware互联网网络应用网络协议 一.Brigde——桥接 :默认使用VMnet0 1.原理: Bridge 桥"就 ...
- 使用HTML5画柱状图
柱状图在很多应用中都比较常见,例如投票结果的统计分析,企业销售数据的统计分析等等. 需求分析: 一个柱状图一般包含以下几部分: 1.标题 2.横坐标(含标题) 3.竖坐标 (含标题.刻度 ...