Oracle与Sql Server差异点详解

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 1、create函数或存储过程异同点       Oracle 创建函数或存储过程一般是 create or replace ……       SQL SERVER 则是在创建之前加一条语句,先判断是否已经存在,如果存在删除已有的函数或存储过程。 函数语句: if exists (select * from dbo.sysobjects where id = object_id

1、create函数或存储过程异同点

      Oracle 创建函数或存储过程一般是 create or replace ……

      SQL SERVER 则是在创建之前加一条语句,先判断是否已经存在,如果存在删除已有的函数或存储过程。

函数语句:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[函数名]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[函数名]
GO

存储过程:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[存储过程名]
GO

2、结构异同点(在新建存储过程的时候,语法格式上的差异)

ORACLE:

Create 部分
IS 定义部分
BEGIN … END; 实现部分

SQL SERVER:

 
Create 部分
AS 定义和实现部分 (AS 下面的代码一般用BEGIN … END 包含)

3、调用参数

ORACLE输入参数        参数名In 参数类型 
ORACLE输出参数        参数名Out 参数类型
SQL SERVER输入参数   参数名 参数类型 IN(IN可以不写,系统默认)  
SQL SERVER输出参数   参数名 参数类型 OUTPUT

4、变量命名及赋值

ORACLE:

1、变量名 随便取
2、定义格式为 变量名 变量类型;
3、给变量赋值为 变量名 := 值;

SQL SERVER:

1、变量名前面一般加@
2、定义格式为 declare 变量名 变量类型
3、SET变量名 =变量类型

5、IF语句

ORACLE:

IF … THEN 
  ….
ELSE
  ...
END IF;

SQL SERVER:

IF ... BEGIN
  ……
END
ELSE BEGIN
  ……
END

或者

IF ... 
BEGIN
  ……
END
ELSE 
BEGIN
  ……
END

6、游标的定义及使用及循环操作

ORACLE定义游标:

CURSOR CurA IS SELECT a FROM tab where …  ;

SQL SERVER定义游标:

DECLARE CurA CURSOR LOCAL FOR SELECT a FROM tab where … ;

ORACLE使用游标:

Open CurA;            -- 打开游标
Fetch CurA Into ISUserUnitPri;
IF CurA%NOTFOUND THEN    -- 注:如果为CurA%FOUND,看下面相同位置注释
    ISUserUnitPri := 1;
END IF;
Close CurA;             -- 关闭游标

SQL SERVER使用游标:

Open CurA              -- 打开游标
Fetch next from CurA Into @ISUserUnitPri
IF @@fetch_status <> 0 BEGIN    -- 注: 则@@fetch_status = 0
   SET @ISUserUnitPri = 1          -- 没有选到记录 给默认值1
END
Close CurA             -- 关闭游标
DEALLOCATE CurA     -- 释放占用资源

ORACLE循环操作游标 (超级简洁):

FOR ISUserUnitPri IN CurA LOOP 
…                       –- 做操作
END LOOP;
注:想循环中间退出循环,用EXIT

SQL SERVER循环操作游标:

Open CurA              -- 打开游标
Fetch next from CurA Into @ISUserUnitPri
While ( @@fetch_status = 0 ) BEGIN    
   ….                    –- 做操作
   Fetch next from CurA Into @ISUserUnitPri
END
Close CurA             -- 关闭游标
DEALLOCATE CurA     -- 释放占用资源
注:想循环中间退出循环,用BREAK
注意: SQL SERVER 使用游标完后,需要删除游标引用(DEALLOCATE cursor_name)。

7、计算时间差

ORACLE:

Oracle 两个时间相减 得到一个以天为单位的带小数的值,需要根据自己的需要再换算成秒值。
-- 这里为 取START_QUEUE_TIME到当前时间的秒数
(SYSDATE - START_QUEUE_TIME)*24*60*60 

SQL SERVER:

SQL SERVER两个时间相减 得到还是时间(从1900-01-01 00:00:00.000开始的时间)。所以想得到以秒的时间差,这么做就麻烦了。
SQL SERVER取时间差,专门有一个DATEDIFF函数,具体看SQL SERVER帮助。
-- 这里为 取START_QUEUE_TIME到当前时间的秒数
DATEDIFF(second, START_QUEUE_TIME,GETDATE())

8、 top N 问题

在sql server中,top N 问题很容易解决,如下例:从表stbdbdj中选取排序后的第一行数据进行赋值。
在sql中解决方法很简单,在select 后面加上:top n 即可,其中 n 代表行数。

select top 1 @entrust_date = entrust_date,
@entrust_no = entrust_no
from run2k..stbdbdj
where entrust_date = @date
and entrust_no > @entrust_no_q
and report_status = '1'
order by entrust_date,entrust_no;

oracle中,没有top n这个命令,我们采取把两层查询方式解决:首先,把需要查找的字段值直接进行排序,然后在外面进行第二次查询,并使用rownum决定行数。

select entrust_date,entrust_no
into @entrust_date, @entrust_no
from ( select entrust_date,entrust_no
from stbdbdj
where entrust_date = @date
and entrust_no > @entrust_no_q
and report_status = '1'
order by entrust_date,entrust_no )
where rownumber <=1 ;

9、如何解决结果集返回时,* 和变量同时存在的问题

下面例子表示,在用游标返回结果集时,同时返回一个变量的值,在sql server中代码如下所示:

select a.*,b.organ_id
from run2k..stbbp a,run2k..stkaccoarg b
where a.date = @entrust_date
and a.serial_no = @serial_no
and a.branch_no = b.branch_no
and a.exchange_type = b.exchange_type;

但在oracle中却没有这种用法,’*’后面必需跟from。解决方法如下:
1
)我们可以把 '*' 变成所需要选择的字段,就是说采用表中需要显示的全部字段表示*
例如:

open  p_cursor  for 
select  branch_no,...,organ_id
where ... 

2)如果这个字段或者说变量是从另外一张表中取出来的,同样可以采用下面的办法。

open p_cursor for
select a.*,b.organ_id;
from stkaccoentrust a, stkaccoarg b
where a.branch_no = b.branch_no
and a.exchange_type = b.exchange_type
and a.init_date = v_entrust_date
and a.serial_no = v_serial_no;

10、用SQL SERVER里CASE函数替换DECODE函数替换

ORACLE

decode(client_status,'0','正常,'1','冻结','2','挂失','3','销户','未知');

SQLSERVER 没有DECODE函数:

case client_status
when '0' then '正常'
when '1' then '冻结'
when '2' then '挂失'
when '3' then '销户'
else '未知'
end

注: 有趣的是 ORACLE的CASE函数,在SQL SERVER里没有找到替代的,只好用IF ELSE 语句解决。

11、oracle的select … into问题

ORACLE里直接取字段值,用select … into语法

select unit_id into unitid from call_user_table where user_id = ‘1231312’;

SQL SERVER直接取则直观的多,直接等于就可以了

select @unitid = unit_id from call_user_table where user_id = ‘1231312’;

12、update语句中 表别名问题

        因为有时候更新表时,需要从另一个表中更新数据,此处Oracle update语句可以给表起别名。但在SQL SERVER中update语句不允许用别名,但可以直接使用表明引用。如下:

oralce

UPDATE A表 a SET a.name = ( select b.name from B表 b where b.id = a.id )

Sql server

UPDATE A表 SET name = ( select B表.name from B表 where B表.id = A表.id )

本文来自百度文库:点击打开链接

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
5天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
3月前
|
SQL Oracle 关系型数据库
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
88 0
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
5天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
5天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL表达式:数据的魔法公式
【4月更文挑战第19天】探索Oracle PL/SQL表达式,体验数据的魔法公式。表达式结合常量、变量、运算符和函数,用于数据运算与转换。算术运算符处理数值计算,比较运算符执行数据比较,内置函数如TO_CHAR、ROUND和SUBSTR提供多样化操作。条件表达式如CASE和NULLIF实现灵活逻辑判断。广泛应用于SQL查询和PL/SQL程序,助你驾驭数据,揭示其背后的规律与秘密,成为数据魔法师。
|
1月前
|
SQL Oracle 关系型数据库
Oracle系列十一:PL/SQL
Oracle系列十一:PL/SQL
|
1月前
|
SQL Oracle 关系型数据库
Oracle系列之八:SQL查询
Oracle系列之八:SQL查询
|
3月前
|
SQL 存储 Oracle
oracle如何定期备份数据库sql文件
【1月更文挑战第7天】oracle如何定期备份数据库sql文件
58 8
|
3月前
|
SQL Oracle 关系型数据库
Oracle PL/SQL基础知识及应用案例
Oracle PL/SQL基础知识及应用案例
33 0

热门文章

最新文章

推荐镜像

更多