通过存储过程动态生成视图

客户最近想把原来的一张统计报表改成SQL视图,报表可以通过参数传入动态生成统计信息,
而视图不能传入参数,所以只能用存储过程去动态生成。

数据表结构
[list]
[*] cost_title_id //费用科目,分组字段
[*] fee //费用,统计字段,要求对一年中12个月的费用分别统计
[*] maint_dept //维护部门,查询条件
[*] fee_type_1 //费用分类,查询条件
[*] out_account_date //抛帐日期
[/list]

生成视图的存储过程

create or replace procedure P_FYKZ_CREATE_VIEW_SUBJECT( P_YEAR IN VARCHAR2 ,P_MAIN_DEPT IN VARCHAR2, FEE_TYPE_1 IN VARCHAR2 ) is

EXESTR VARCHAR2(5000);

begin
EXESTR := 'CREATE OR REPLACE VIEW FYKZ_VIEW_SUBJECT AS(select p.cost_title_id';

--通过for循环对12个月份进行分别统计,函数GETSUBSELFORSUM可以获得子查询字符串
for i in 1..12 loop
if LENGTH(i) = 1 then
EXESTR := EXESTR || ',' || GETSUBSELFORSUM(P_YEAR,'0' || i,P_MAIN_DEPT,FEE_TYPE_1);
else
EXESTR := EXESTR || ',' || GETSUBSELFORSUM(P_YEAR,i,P_MAIN_DEPT,FEE_TYPE_1);
end if;
end loop;

EXESTR := EXESTR || ' from fykz_b_result_data p where p.cost_title_id is not null and substr(p.out_account_date,0,4) = '|| P_YEAR ||' group by p.cost_title_id )';

--生成视图
execute immediate EXESTR;
end;


月份子查询统计

create or replace function GETSUBSELFORSUM(P_YEAR IN VARCHAR2, P_MONTH IN VARCHAR2 ,P_MAIN_DEPT IN VARCHAR2, FEE_TYPE_1 IN VARCHAR2) return varchar2 is
Result varchar2(500);
begin
--对传入月份进行sum合计
Result := '(select sum(t.fee) from fykz_b_result_data t where substr(t.out_account_date,0,6) = '|| P_YEAR || P_MONTH || '
and t.cost_title_id = p.cost_title_id';

--不为空时插入维护部门查询条件
if LENGTH(P_MAIN_DEPT) > 0 then
Result := Result || ' and t.maint_dept = '''|| P_MAIN_DEPT || '''';
end if;

--不为空时插入费用分类查询条件
if LENGTH(FEE_TYPE_1) > 0 then
Result := Result || ' and t.fee_type_1 = '''|| FEE_TYPE_1 || '''';
end if;

Result := Result || ') AS MONTH' || P_MONTH;
return(Result);
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值