SQL server函数转Oracle问题之一,强行使用临时表
(多次修改,现在可以用了)
1.工作中遇见的问题,背景是客户的数据库迁移,SQL server迁到Oracle。网上没有对应的办法,也不知对不对,至少不报BUG了,分享给大家
流程如下图
这种创建方法百度“Oracle函数返回结果集(或临时表)”有一堆,不重复说了。
注意:
临时表函数中还要定义,格式如下:
(就像JAVA的定义)
然后剩余步骤:
*****************分割线
*****************分割线
*****************分割线
*****************分割线
*****************分割线
sqlserver源码:
CREATE function [dbo].[fn_g_CompareAllData](@pk_corp varchar(20),@BeginDate datetime,@EndDate datetime)
returns @tem table
(
SN bigint,
--csalereceiveid char(20), --发货单主键
vreceivecode char(30), --发货单号
nnumber decimal(20,0), --数量
ntotaloutinvnum decimal(20,0), --数量
ntotaltransnum decimal(20,0), --累计运输数量
--csaleid char(20), --发货单主键
--pk_transport_h char(20), --运输单主键
vbillcode_t char(30), --运输单号
ntotalnumber decimal(20,0), --存货总数量
reserve5 decimal(20,0), --周转桶数
--transportcode char(20), --运输单主键
vbillcode_r char(30), --回收单号
ntotalnumber2 numeric(28,0), --发货单数量
backwaternum numeric(28,0), --退水数量
exwaternum numeric(28,0), --换水数量
yabucketnum numeric(28,0), --押退桶数量
getbucketnum numeric(28,0), --借/还桶数量
sendbucketnum numeric(28,0), --赠桶数量
backbucketnum numeric(28,0), --回桶数量
notclearnum numeric(28,0) --车辆未结清数量
)
begin
--set @pk_corp = '3001'
--set @BeginDate = '2013-08-01'
--set @EndDate = '2013-08-11'
set @pk_corp = (select top 1 pk_corp from bd_corp where unitcode = @pk_corp);
declare @All table
(
SN bigint identity(1,1),
csalereceiveid char(20), --发货单主键
vreceivecode char(30), --发货单号
nnumber decimal(20,0), --数量
ntotaloutinvnum decimal(20,0), --数量
ntotaltransnum decimal(20,0), --累计运输数量
csaleid char(20), --发货单主键
pk_transport_h char(20), --运输单主键
vbillcode_t char(30), --运输单号
ntotalnumber decimal(20,0), --存货总数量
reserve5 decimal(20,0), --周转桶数
transportcode char(20), --运输单主键
vbillcode_r char(30), --回收单号
ntotalnumber2 numeric(28,0), --发货单数量
backwaternum numeric(28,0), --退水数量
exwaternum numeric(28,0), --换水数量
yabucketnum numeric(28,0), --押退桶数量
getbucketnum numeric(28,0), --借/还桶数量
sendbucketnum numeric(28,0), --赠桶数量
backbucketnum numeric(28,0), --回桶数量
notclearnum numeric(28,0) --车辆未结清数量
);
with so_salereceive_w as
(
select
b.csalereceiveid,
b.vreceivecode,
sum(c.nnumber) as nnumber,
sum(c.ntotaloutinvnum) as ntotaloutinvnum,
sum(c.ntotaltransnum) as ntotaltransnum
from so_salereceive b with(nolock)
inner join so_salereceive_b c with(nolock) on b.csalereceiveid = c.csalereceiveid
inner join bd_invbasdoc d with(nolock) on c