水晶报表可以连接oracle的存储过程吗
2017-02-27
水晶报表可以连接oracle的存储过程,但是不是随便写一个在数据库中可以运行的存储过程就可以的。具体的步骤的话我不是特别清楚,现在很少用到水晶报表了,一般情况下用的都是finereport,这样的话就和题主稍微说下我现在用的工具的方法吧,应该是差不多的。
1、创建包
由于需要但会查询出来的数据集,需要在PL/SQL中创建一个package,这个包里面定义一个ref cursor类型,用于记录sql语句查询出来的结果集。如下图:
创建包的代码如下:
create or replace package pagingPackage as
type paging_cursor is ref cursor;
end pagingPackage;
存储过程
编写存储过程,如下图:
具体代码如下:
create or replace procedure paging
(tableName in varchar2 ,--表名
pageSizes in number,--每页显示记录数
pageNow in number,--当前页
rowNums out number,--总记录数
pageNum out number,--总页数
paging_cursor out pagingPackage.paging_cursor) is
--定义部分
--定义sql语句,字符串
v_sql varchar2(1000);
--定义两个整数,用于表示每页的开始和结束记录数
v_begin number:=(pageNow-1)*pageSizes+1;
v_end number:=pageNow*pageSizes;
begin
--执行部分
v_sql:='select * from (select t1.*,rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin;
--把游标和sql语句关联
open paging_cursor for v_sql;
--计算rowNums和pageNum
--组织一个sql语句
v_sql:='select count(*) from '||tableName;
--执行该sql语句,并赋给rowNums
execute immediate v_sql into rowNums;
--计算pageNum
if mod(rowNums,pageSizes)=0 then
pageNum := rowNums/pageSizes;
else
pageNum := rowNums/pageSizes+1;
end if;
end;