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

时间: 2024-08-11 12:18:45

Oracle 与 SqlServer 的区别浅析总结的相关文章

oracle与sqlserver部分区别

oracle和sqlserver的区别:1,执行修改操作要接commit,不然数据仅仅只是查看,并不是提交数据2,oracle不能使用select 字段 这种查看方式查看数据:3,oracle存储过程可以先写包,相当于声明数据类型,然后实现sql这种4,oracle表里自增是用序列,(理解:相当于声明一个唯一key值自增,查出一次后就相当于使用了)5,oracle的赋值操作 变量:=数值 这种, 6,oracle不能像sqlserver一样用@iddent(不记得了)insert之后的值,使用方

Oracle/Mysql/SqlServer函数区别

mysql日期和时间格式转换 Linux scp 使用详解 Oracle/Mysql/SqlServer函数区别 2011-07-01 12:34:36|  分类: Mysql技术 |  标签:mysql  sqlsever  oracle  函数   |举报 |字号大中小 订阅 Sql代码 1.类型转换 --Oracle select to_number('123') from dual; --123; select to_char(33) from dual;  --33; select t

Oracle 和 SqlServer 的区别

--sql server 与  oracle的区别: --DBMS 数据库管理系统--1.数据类型不同.      --sql server 的数据类型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima,      --float,bit……                  --oracle 的数据类型:number(p,s),char,varchar2,Date,LOB 

你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗

ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性:    Oracle.MYSQL与DB2可在所有主流平台上运行:    SQL Server只能在Windows下运行: --安全性:    Oracle的安全认证获得最高认证级别的ISO标准认证,而SQL Server并没有获得什么安全认证:    这方面证明了Oracle的安全性是高于SQL Server的: --数据类型.函数.sql语句:    oracle中有复合数据类型,sql server中没有: 总之:   

SqlServer 、Oracle 、MySql 的区别

一.sqlserver 优点: 易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等: 为数据管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应,从而获得竞争优势.从数据管理和分析角度看,将原始数据转化为商业智能和充分利用Web带来的机会非常重要.作为一个完备的数据库和数据分析包,SQLServer为快速开发新一代企业级商业应用程序.为企业赢得核心竞争优势打开了胜利之门.作为重要的基准测试可伸缩性和速度奖的记录保持者,SQLS

MYSQL-实现ORACLE 和SQLserver数据中- row_number() over(partition by ) 分组排序功能

网上看见了好多例子都基本上是一样的,没有过多的解释,对于一个初学MySQL来说有点难,我把部分转摘过来如下 原文:http://www.cnblogs.com/buro79xxd/archive/2012/08/29/2662489.html 要求目标:1.确定需求: 根据部门来分组,显示各员工在部门里按薪水排名名次. 创建表格:2.来创建实例数据: drop table if exists heyf_t10; create table heyf_t10 (empid int ,deptid i

C#中ref和out的区别浅析

这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:       ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都必

Java学习-006-三种数据库连接 MySQL、Oracle、sqlserver

此文主要讲述在初学 Java 时,常用的三种数据库 MySQL.Oracle.sqlserver 连接的源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:2015-1-31 10:46:48,请知悉. 所需的 jar 包下载链接为:http://yunpan.cn/cKEWbBntAjtKy  访问密码 bd58 以下为初学 Java 常用的三种数据库 MySQL.Oracle.sqlserver 连接的源代码,敬请参阅! MyS

oracle实例,数据库,服务器区别

实例(instance) 实例是一个非固定的,基于内存的基本进程与内存结构.当服务器关闭时,实例就不存在了. 数据库(DataBase) 数据库指固定的,基于磁盘的数据文件,控制文件,日志文件,参数文件,归档日志文件.一般情况下一个数据库包含一个实例. 数据库服务器(database server) 数据库服务器一般指数据库各软件部分(sqlplus,exp/imp,oem),实例,数据库三部分.是由安装在服务器上的所有软件及服务启动成功后的实例组成的. oracle实例,数据库,服务器区别,布