oracle与sql的相同点,Oracle与Sql Server差异点详解

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 )

本文来自百度文库:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值