由于客户的要求一直在与时俱进,故需要HAMS对报表的可定义性要求很高. 现在HAMS的报表支持用户自定义函数 .将会在以后的文章中说明.
今天主要说HAMS如何使用存储过程.以及存储过程的一些基本知识. 此篇文章针对oracle数据库 一. 业务北背景. 用户需要根据年度统计每个档案类型(门类)的库存情况,案卷和文件各有多少数量 二. 解决思路: 定义存储过程,年度作为参数,传入存储过程,返回结果集游标. 网上存储过程的教程有很多,这里直接上DEMO了. 三. 定义存储过程:
名为PRINTCOUNT的存储过程,共计4个参数,
三个输入数据参数(选中条目id , attr 归档前后标识, tablename 报表将做在哪张表上)
一个输出参数(游标),代码如下:CREATE OR REPLACE PROCEDURE PRINTCOUNT (did in number ,attr number ,tablename in varchar2 , cur out sys_refcursor ) AS
nd varchar2(8);
dalxchname varchar2(64);
libcode number;
hasvol number;
v_count number(1);
temptable_name varchar2(20);
voltablename varchar2(8);
filetablename varchar2(8);
p_ sql Varchar2(4000);
type rc_type is ref cursor;
mycur rc_type;
BEGIN
temptable_name:= 'tempTable4out';
select count(*) into v_count from user_tables where table_name=upper(temptable_name);
if(v_count = 0) then
p_sql:='create global temporary table tempTable4out(dalxname varchar2(100) , volnum number , filenum number) ON COMMIT PRESERVE ROWS';
Execute Immediate p_sql;
else
p_sql:='truncate table tempTable4out';
Execute Immediate p_sql;
commit;
p_sql:='drop table tempTable4out ';
Execute Immediate p_sql;
p_sql:='create global temporary table tempTable4out(dalxname varchar2(100) , volnum number , filenum number) ON COMMIT PRESERVE ROWS';
Execute Immediate p_sql;
end if;
--得到选中条目的年度
p_sql:='select nd from '||tablename||' where status=0 and did='||did;
Execute Immediate p_sql into nd;
p_sql:='SELECT code ,chname,hasvol from s_dalx where status=0';
open mycur for p_sql ;
fetch mycur into libcode, dalxchname,hasvol;
while (mycur%found)
loop
filetablename := 'D_FILE'||libcode;
if hasvol = 1 then
voltablename := 'D_VOL'||libcode;
p_sql:='insert into tempTable4out(dalxname,volnum,filenum) select '''||dalxchname||''' , countitemnum('''||voltablename||''','''||nd||''' , '||attr||'), countitemnum('''||filetablename||''','''||nd||''' , '||attr||') from dual';
else
p_sql:='insert into tempTable4out(dalxname,volnum,filenum) select '''||dalxchname||''' ,0 , countitemnum('''||filetablename||''','''||nd||''' , '||attr||') from dual';
end if;
Execute Immediate p_sql;
commit;
fetch mycur into libcode, dalxchname,hasvol;
end loop;
close mycur;
open cur for 'select dalxname as 案卷_档号, volnum as 案卷_ID,filenum as 案卷_父ID from tempTable4out';
end;
注意 输出游标title的名字要和报表设计器中的一致如下图:
上面存储过程中使用了一个自定义函数.code如下:
create or replace function countItemNum(tablename in varchar2 , nd in varchar2 , attr in number) return number
as
tempSql varchar2(2000);--临时sql语句
countNumber number;--返回参数
begin
tempSql := 'select count(*) from '||tablename||' where status=0 and attr='||attr||' and nd='''||nd||'''';
EXECUTE IMMEDIATE tempSql into countNumber;
return countNumber;
end countItemNum;
二. 存储过程在Lams中调用
新建报表,填写存储过程名和参数,如下图
produce报表内容:
PRINTCOUNT--param--dids--param--int:0--param--str:D_VOL0说明: 存储过程名字( PRINTCOUNT)--param-- 是关键分割字体(程序使用,照些就可以)三个输入参数分别是, dids , 0 (代表归档前后), D_VOL0 报表做在哪张表上注意dids,是不需要类型的.确定后.设计报表如下图:
三. 打印
完毕了! 欢迎大家尝试,如果用问题,请留言!