(z) SQL Server vs Oracle 存储过程语法转换

(z) SQL Server vs Oracle 存储过程语法转换

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 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;

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)
子串 父串 ---> 父串 子串

你可能感兴趣的:((z) SQL Server vs Oracle 存储过程语法转换)