标题:[原创]Sql server --Oracle存储过程转换总结一
只看楼主
w3200446
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-3-3
 问题点数:0 回复次数:1 
[原创]Sql server --Oracle存储过程转换总结一
Sql server --Oracle存储过程转换总结一

Oracle PL/SQL 使用总结:
1、 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 ;


2、如何解决结果集返回时,* 和变量同时存在的问题。
下面例子表示,在用游标返回结果集时,同时返回一个变量的值,在,所 sql中代码如下所示,
但在oracle中却没有这种用法,’*’后面必需跟from.
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;
解决方法如下:
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;

3、外联接问题:
sql : oracle
a = *b <---> a(+)= b
a *= b <---> a = b(+)

4、多条记录求和问题:
select sum(A+B+C)
into D
from ...
where ...
group by ...

单条记录求和:
select A+B
into C
from ...
where ...
5、case 问题转换:
sql:
case client_status
when '0' then '正常'
when '1' then '冻结'
when '2' then '挂失'
when '3' then '销户'
else '未知'
end

oracle:

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

6、char 和 varchar 类型区别: char 尾部补空格,varchar 尾部不补空格。

7、convert转换问题:
sql oracle
convert(char(5),branch_no) ---> to_char(branch_no,'99999')
convert(char(19),count(*)) ---> lpad(to_char(count(*)),19)
convert(varchar(20),serial_no) ---> to_char(serial_no,'999...9' )
总共20个9
lpad(to_char(serial_no),20)


8、charindex(substring,string) ---> instr(string,substring)
子串 父串 父串 子串

异常处理:

(1)、update 和 delete 在更新或删除0行记录时,不报异常。sql认为删除0行记录不算异常。
但在系统中我们如果想做处理,在删除或更新0行记录时报相应信息,就必需自定义异常,
如下例:
e_error exception;
...
begin
update sysarg
set branch_no = p_branch_no
where ...
if sql%rowcount != 1 then
raise e_error;
end if;
exception
when e_error then
null;
end;

(2)、select into 出现无行结果集时,自动触发NO_DATA_FOUND异常,
出现多行结果集时,自动触发Too_Many_Rows异常
(3)、when others 异常处理程序处理所有没有指定处理程序的异常。



搜索更多相关主题的帖子: Oracle Sql server 
2006-03-03 22:47
孙大圣
Rank: 2
等 级:新手上路
威 望:4
帖 子:127
专家分:0
注 册:2006-2-23
得分:0 
不错,又学了点oracle

非学无以广才,非志无以成学
2006-03-05 23:09



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-48329-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017027 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved