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 (NFN, NIF, NTF)) drop function [dbo].[函数名] GO
存储过程:
if exists (select * from dbo.sysobjects where id = object_id(N[dbo].[存储过程名]) and OBJECTPROPERTY(id, NIsProcedure) = 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 END IF;
SQL SERVER:
IF ... BEGIN ELSE BEGIN END
或者
IF ... BEGIN 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 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 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
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 Server ] 计算N个月前,N个月后的方法 #1. 计算N个月前的日期 #2. 计算N个月后的日期 #3. 月末最后一天的情况(计算从日数多的月到日数较少的月) #4. 月末最后一天的情况(计算从日数少的月到日数较多的月)
【SQL Server】数据库开发指南(三)面向数据分析的 T-SQL 编程技巧与实践 T-SQL 指的是 Transact-SQL,是一种针对 Microsoft SQL Server 数据库系统的 SQL 方言。T-SQL 扩展了标准 SQL 语言,提供了更多的功能和特性,包括事务处理、错误处理、游标处理、动态 SQL、存储过程、触发器、用户定义函数等等。
第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践 立即下载
相关文章
- Oracle 11g服务器安装详细步骤——图文教程(系统 windows server 2012 R2)
- 【性能优化】CBO,RBO在ORACLE 10g 中的应用
- struts+hibernate+oracle+easyui实现lazyout组件的简单案例——hibernate的config文件(hibernate.cfg.xml)
- oracle基本笔记整理及案例分析2
- Oracle Linux Server release 6.3 下安装JDK
- Oracle 11g RAC INS-06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
- 查看oracle数据库允许的最大连接数和当前连接数
- PostgreSQL Oracle 兼容性之 - PL/SQL FORALL, BULK COLLECT
- SQL Server vs Oracle 简单语法比较
- oracle与sql server大批量存储过程可以替换部分
- SQL Server vs Oracle 简单语法比较
- Oracle表操作 (未完待续)
- Oracle与Sql Server差异点详解
- oracle与sql server大批量存储过程可以替换部分
- mybatis连接Oracle执行begin..end批量操作返回行数问题
- oracle 快照(snapshot) 管理