您当前的位置: 首页 >  sql

衣舞晨风

暂无认证

  • 0浏览

    0关注

    1156博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Oracle与Sql Server差异点详解

衣舞晨风 发布时间:2014-01-22 08:25:25 ,浏览量:0

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             
关注
打赏
1647422595
查看更多评论
0.0410s