如何在jasperreport中使用存储过程
Jasper Report 不能直接调用oracle的存储过程,因为存储过程不能返回标准的
sql结果集。作为一个替代解决方法,可以使用函数来从存储过程获取结果集。
为了能够用函数来获取存储过程的结果集,需要使用到临时表来暂存结果,然后
返回table类型的结果。
下面是示例步骤,供参考:
1. 创建临时表:
第一步,创建临时表暂存存储过程结果,这样Jasper Report就能够使用标准
sql通过存储函数来查询结果。创建临时表语句:
[color=indigo]CREATE GLOBAL TEMPORARY TABLE “TEMP_PRESIDENTS” (
ID NUMBER(10) not null,
NAME VARCHAR(32) not null,
BIRTHDATE DATE not null,
PARTY char(1) not null
) ON COMMIT PRESERVE ROWS[/color]
2 创建存储过程
创建存储过程来处理获得所需数据。语句如下:
[color=indigo]CREATE PROCEDURE “LOAD_TEMP_PRESIDENTS” (
partyParam CHAR )
as
begin
EXECUTE IMMEDIATE ‘TRUNCATE TABLE TEMP_PRESIDENTS’;
COMMIT;
INSERT INTO TEMP_PRESIDENTS
SELECT ID, NAME, BIRTHDATE, PARTY FROM PRESIDENTS WHERE PARTY = partyParam;
COMMIT;
end;
[/color]
3. 测试存储过程:
[color=indigo] call LOAD_TEMP_PRESIDENTS(‘D’);
select * from TEMP_PRESIDENTS;[/color]
4. 创建返回类型:
该返回类型用来从临时表返回结果。这个类型就是你在Jasper Report里面所描述的结果信息。
[color=indigo]CREATE OR REPLACE TYPE “PRESIDENT_TYPE” AS OBJECT (
ID NUMBER(10),
NAME VARCHAR2(32),
BIRTHDATE DATE,
PARTY CHAR(1)
)[/color]
5. 创建表类型
这一步骤,我们基于上一步创建表类型。 这个“表”就是我们在Jasper Report里面做查询的那个表。这不是一个真实的表。
[color=indigo]CREATE OR REPLACE TYPE “PRESIDENT_TYPE_TABLE” AS TABLE OF “PRESIDENT_TYPE”[/color]
6. 创建存储函数
[color=indigo]CREATE OR REPLACE FUNCTION “PRESIDENTS_FUNC” (
partyParam CHAR
)
return PRESIDENT_TYPE_TABLE pipelined
is
PRAGMA AUTONOMOUS_TRANSACTION;
TYPE ref0 is REF CURSOR;
myCursor ref0;
out_rec PRESIDENT_TYPE := PRESIDENT_TYPE(0, null, null, null);
BEGIN
LOAD_TEMP_PRESIDENTS(partyParam);
open myCursor for
select id,
name,
birthdate,
party
from TEMP_PRESIDENTS;
LOOP FETCH myCursor into
out_rec.ID,
out_rec.NAME,
out_rec.BIRTHDATE,
out_rec.PARTY;
EXIT WHEN myCursor%NOTFOUND;
PIPE ROW(out_rec);
END LOOP;
CLOSE myCursor;
RETURN;
END;[/color]
7. 测试并使用存储函数
[color=indigo]select * from table(PRESIDENTS_FUNC(‘D’))[/color]
通过以上步骤,我们就可以在Jasper Report里面使用了基于存储过程的标准查询了。
Jasper Report 不能直接调用oracle的存储过程,因为存储过程不能返回标准的
sql结果集。作为一个替代解决方法,可以使用函数来从存储过程获取结果集。
为了能够用函数来获取存储过程的结果集,需要使用到临时表来暂存结果,然后
返回table类型的结果。
下面是示例步骤,供参考:
1. 创建临时表:
第一步,创建临时表暂存存储过程结果,这样Jasper Report就能够使用标准
sql通过存储函数来查询结果。创建临时表语句:
[color=indigo]CREATE GLOBAL TEMPORARY TABLE “TEMP_PRESIDENTS” (
ID NUMBER(10) not null,
NAME VARCHAR(32) not null,
BIRTHDATE DATE not null,
PARTY char(1) not null
) ON COMMIT PRESERVE ROWS[/color]
2 创建存储过程
创建存储过程来处理获得所需数据。语句如下:
[color=indigo]CREATE PROCEDURE “LOAD_TEMP_PRESIDENTS” (
partyParam CHAR )
as
begin
EXECUTE IMMEDIATE ‘TRUNCATE TABLE TEMP_PRESIDENTS’;
COMMIT;
INSERT INTO TEMP_PRESIDENTS
SELECT ID, NAME, BIRTHDATE, PARTY FROM PRESIDENTS WHERE PARTY = partyParam;
COMMIT;
end;
[/color]
3. 测试存储过程:
[color=indigo] call LOAD_TEMP_PRESIDENTS(‘D’);
select * from TEMP_PRESIDENTS;[/color]
4. 创建返回类型:
该返回类型用来从临时表返回结果。这个类型就是你在Jasper Report里面所描述的结果信息。
[color=indigo]CREATE OR REPLACE TYPE “PRESIDENT_TYPE” AS OBJECT (
ID NUMBER(10),
NAME VARCHAR2(32),
BIRTHDATE DATE,
PARTY CHAR(1)
)[/color]
5. 创建表类型
这一步骤,我们基于上一步创建表类型。 这个“表”就是我们在Jasper Report里面做查询的那个表。这不是一个真实的表。
[color=indigo]CREATE OR REPLACE TYPE “PRESIDENT_TYPE_TABLE” AS TABLE OF “PRESIDENT_TYPE”[/color]
6. 创建存储函数
[color=indigo]CREATE OR REPLACE FUNCTION “PRESIDENTS_FUNC” (
partyParam CHAR
)
return PRESIDENT_TYPE_TABLE pipelined
is
PRAGMA AUTONOMOUS_TRANSACTION;
TYPE ref0 is REF CURSOR;
myCursor ref0;
out_rec PRESIDENT_TYPE := PRESIDENT_TYPE(0, null, null, null);
BEGIN
LOAD_TEMP_PRESIDENTS(partyParam);
open myCursor for
select id,
name,
birthdate,
party
from TEMP_PRESIDENTS;
LOOP FETCH myCursor into
out_rec.ID,
out_rec.NAME,
out_rec.BIRTHDATE,
out_rec.PARTY;
EXIT WHEN myCursor%NOTFOUND;
PIPE ROW(out_rec);
END LOOP;
CLOSE myCursor;
RETURN;
END;[/color]
7. 测试并使用存储函数
[color=indigo]select * from table(PRESIDENTS_FUNC(‘D’))[/color]
通过以上步骤,我们就可以在Jasper Report里面使用了基于存储过程的标准查询了。