SQL Server vs Oracle 存储过程语法转换12Word格式.docx
《SQL Server vs Oracle 存储过程语法转换12Word格式.docx》由会员分享,可在线阅读,更多相关《SQL Server vs Oracle 存储过程语法转换12Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
IF'
TF'
))
dropfunction[dbo].[函数名]
GO
存储过程
[dbo].[存储过程名]'
)andOBJECTPROPERTY(id,N'
IsProcedure'
)=1)
dropprocedure[dbo].[存储过程名]
2结构异同点
ORACLE
Create部分
IS定义部分
BEGIN…END;
实现部分
SQLSERVER
AS定义和实现部分(AS下面的代码一般用BEGIN…END包含)
3调用参数
ORACLE输入参数参数名In参数类型
ORACLE输出参数参数名Out参数类型
SQLSERVER输入参数参数名参数类型IN(IN可以不写,系统默认)
SQLSERVER输出参数参数名参数类型OUTPUT
4变量命名及赋值
1、变量名随便取
2、定义格式为变量名变量类型;
3、给变量赋值为变量名:
=值;
1、变量名前面一般加@
2、定义格式为declare变量名变量类型
3、SET变量名=变量类型
5IF语句
IF…THEN
….
ELSE
...
ENDIF;
IF...BEGIN
……
END
ELSEBEGIN
或者
IF...
BEGIN
ELSE
6case语句
7游标的定义及使用及循环操作
ORACLE定义游标
CURSORCurAISSELECTaFROMtabwhere…;
SQLSERVER定义游标
DECLARECurACURSORLOCALFORSELECTaFROMtabwhere…;
ORACLE使用游标
OpenCurA;
--打开游标
FetchCurAIntoISUserUnitPri;
IFCurA%NOTFOUNDTHEN--注:
如果为CurA%FOUND,看下面相同位置注释
ISUserUnitPri:
=1;
CloseCurA;
--关闭游标
SQLSERVER使用游标
OpenCurA--打开游标
FetchnextfromCurAInto@ISUserUnitPri
IF@@fetch_status<
>
0BEGIN--注:
则@@fetch_status=0
SET@ISUserUnitPri=1--没有选到记录给默认值1
CloseCurA--关闭游标
DEALLOCATECurA--释放占用资源
ORACLE循环操作游标(超级简洁)
FORISUserUnitPriINCurALOOP
…–-做操作
ENDLOOP;
想循环中间退出循环,用EXIT
SQLSERVER循环操作游标
While(@@fetch_status=0)BEGIN
….–-做操作
FetchnextfromCurAInto@ISUserUnitPri
想循环中间退出循环,用BREAK
注意:
SQLSERVER使用游标完后,需要删除游标引用(DEALLOCATEcursor_name)。
8计算时间差
Oracle两个时间相减得到一个以天为单位的带小数的值,需要根据自己的需要再换算成秒值。
--这里为取START_QUEUE_TIME到当前时间的秒数
(SYSDATE-START_QUEUE_TIME)*24*60*60
SQLSERVER两个时间相减得到还是时间(从1900-01-0100:
00:
00.000开始的时间)。
所以想得到以秒的时间差,这么做就麻烦了。
SQLSERVER取时间差,专门有一个DATEDIFF函数,具体看SQLSERVER帮助。
DATEDIFF(second,START_QUEUE_TIME,GETDATE())
9topN问题
在sqlserver中,topN问题很容易解决,如下例:
从表stbdbdj中选取排序后的第一行数据进行赋值。
在sql中解决方法很简单,在select后面加上:
topn即可,其中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
report_status
'
1'
order
by
entrust_date,entrust_no;
在oracle中,没有topn这个命令,我们采取把两层查询方式解决:
首先,把需要查找的字段值直接进行排序,然后在外面进行第二次查询,并使用rownum决定行数。
entrust_date,entrust_no
into
@entrust_date,
@entrust_no
(
stbdbdj
entrust_date,entrust_no
)
rownumber
<
=1
;
10如何解决结果集返回时,*和变量同时存在的问题
下面例子表示,在用游标返回结果集时,同时返回一个变量的值,在sqlserver中代码如下所示:
a.*,b.organ_id
run2k..stbbp
a,run2k..stkaccoarg
b
a.date
@entrust_date
a.serial_no
@serial_no
a.branch_no
b.branch_no
a.exchange_type
b.exchange_type;
但在oracle中却没有这种用法,’*’后面必需跟from。
解决方法如下:
1)我们可以把'
*'
变成所需要选择的字段,就是说采用表中需要显示的全部字段表示*。
例如:
open
p_cursor
for
select
branch_no,...,organ_id
where...
2)如果这个字段或者说变量是从另外一张表中取出来的,同样可以采用下面的办法。
open
for
a.*,b.organ_id;
stkaccoentrust
a,
stkaccoarg
b.exchange_type
a.init_date
v_entrust_date
v_serial_no;
11外联接问题
Sqlserver<
--->
oracle
a=*b<
a(+)=b
a*=b<
a=b(+)
12多条记录求和问题
selectsum(A+B+C)
intoD
from...
where...
groupby...
单条记录求和
selectA+B
intoC
13用SQLSERVER里CASE函数替换DECODE函数替换
decode(client_status,'
0'
'
正常,'
冻结'
2'
挂失'
3'
销户'
未知'
);
SQLSERVER没有DECODE函数
caseclient_status
when'
then'
正常'
else'
end
有趣的是ORACLE的CASE函数,在SQLSERVER里没有找到替代的,只好用IFELSE语句解决。
14oracle的select…into问题
ORACLE里直接取字段值,用select…into语法
selectunit_idintounitidfromcall_user_tablewhereuser_id=‘1231312’;
SQLSERVER直接取则直观的多,直接等于就可以了
select