第1章 概述
UniEAP Report支持存储过程数据源,即支持通过执行用户构建的存储过程查询语句获得报表数据的结果集。
第2章 名词解释
数据源:数据源形成UniEAP Report与报表数据来源(数据库、数据文件等)的JDBC连接,创建数据集时将从对应的数据源中选择数据表、字段等信息,以及预览报表时从数据库、数据文件等报表数据来源中读取数据。
数据源是为报表服务的,但是数据源和报表之间是相互独立的,一份报表可以使用多个不同的数据源,同样一个数据源也可以被多个报表引用。
第3章 存储过程数据源的使用方法
3.1 配置数据源信息
3.1.1 connection-config.xml文件配置
在当前引擎应用\WEB-INF\conf\unieap\connection\connection-config.xml文件中,添加数据源信息。例子如下:
<c3p0-connection name="northwind">
<url>jdbc:oracle:thin:@10.4.44.35:1521:unieap</url>
<driverclass>oracle.jdbc.driver.OracleDriver</driverclass>
<user>northwind</user>
<password>report</password>
<min-pool-size>3</min-pool-size>
<max-pool-size>15</max-pool-size>
<checkout-timeout>0</checkout-timeout>
<max-idle-time>0</max-idle-time>
<idle-connection-test-period>0</idle-connection-test-period>
<test-connection-on-checkin>false</test-connection-on-checkin>
<test-connection-on-checkout>false</test-connection-on-checkout>
<max-statements>0</max-statements>
<max-statements-per-connection>0</max-statements-per-connection>
<acquire-increment>3</acquire-increment>
</c3p0-connection>
<c3p0-connection name="sqlserver">
<url>jdbc:sqlserver://10.4.44.74:1433;database=report_test</url>
<driverclass>com.microsoft.sqlserver.jdbc.SQLServerDriver</driverclass>
<user>report</user>
<password>report</password>
<min-pool-size>3</min-pool-size>
<max-pool-size>15</max-pool-size>
<checkout-timeout>0</checkout-timeout>
<max-idle-time>0</max-idle-time>
<idle-connection-test-period>0</idle-connection-test-period>
<test-connection-on-checkin>false</test-connection-on-checkin>
<test-connection-on-checkout>false</test-connection-on-checkout>
<max-statements>0</max-statements>
<max-statements-per-connection>0</max-statements-per-connection>
<acquire-increment>3</acquire-increment>
</c3p0-connection>
3.1.2 datasource.xml文件配置
在当前引擎应用\WEB-INF\conf\unieap\report\datasource.xml文件中,添加存储过程数据源信息。其中”northwind”与”sqlserver”与connection-config.xml中配置的数据源名称保持一致。
如果配置正确,在新建数据集中选择存储过程数据源时将看到如下内容:
<Category Name="sp" Caption="UniEAP sp数据源 "
SourceClass="com.neusoft.unieap.dataset.datasource.impl.SpDataSource"
QuerierClass="com.neusoft.unieap.dataset.executer.sp.DrmSpDatasetExecuter">
<DataSource Name="northwind" Caption="Report30样例库"></DataSource>
<DataSource Name="sqlserver" Caption="Report30样例库"></DataSource>
</Category>
3.2 存储过程数据集的创建
3.2.1 创建SP类型数据集的步骤
(1)在数据集面板中,单击右键数据集节点,选择菜单中的“新建”;如下图所示:
(2)系统弹出新建数据集窗口,选择数据源类型为存储过程数据源,并选择需要的数据源名称,输入数据集名称,如下图所示:
(3)点击<下一步>按钮,进入存储过程数据集的定义向导界面 (4)填写存储过程数据集定义和字段列表,如下图所示:
(5)点击确定按钮结束,即可查看新建的数据集,如图所示:
3.2.2 存储过程数据集的定义的使用方法
3.2.2.1 定义填写有两种方式:
(1)call procedureName($param_in1,$param_in2,…,#param_out1,#param_out2,...):用于返回单值。
(2)call procedureName($param_in1,$param_in2,…,#ColumnResult):用于返回结果集(注:oracle中以游标返回结果集也采用这种方式)。
- call是调用命令
- procedureName是数据库中存储过程的名称
- (…)中为参数
3.2.2.2 重要说明:
- 方式一,支持以$开头的输入参数(in参数)和以#开头的输出参数(out参数)。
- 方式二,使用关键字#ColumnResult标识,支持以$开头的输入参数(in参数)。
- 两种方式分别对应两种返回的结果:单值和结果集,即不能既返回单值,又返回结果集。
- in参数,存储过程的输入参数,等价于报表中的参数,在定义中只能以$param_in形式的报表参数填写。如下图所示,$param与参数param保持一致。
- out参数,存储过程通过输出参数来返回单值,可以返回多个out参数,用#+参数名(排除ColumnResult)表示,如#param。
- 关键字#ColumnResult(区分大小写)作用,(1)用于标识方式二。(2) oracle中以游标返回结果集应用时,标识存储过程中游标输出参数的位置。
- 参数的顺序,要与存储过程中参数的顺序一致。
3.2.2.3 填写数据集定义举例:
返回单值:假设有两个in参数和两个out参数,如下图所示:
返回结果集:假设有一个in参数
3.2.3 字段列表的使用方法
字段列表可通过上移、下移、添加、删除按钮操作,字段名称和类型要求如下:
如果定义采用方式一,即返回单值的情况:字段的名称和定义中的out参数名称保持一致(区分大小写),字段的类型与存储过程对应返回值类型保持一致。如下图所示:
如果定义采用方式二,即返回结果集的情况:字段的名称和存储过程中返回的结果集中字段名称保持一致,字段的类型与存储过程对应返回值类型保持一致。例子见下节中存储过程写法举例。
3.3 存储过程写法举例
3.3.1 Oracle存储过程举例:
返回单值:假设两个输入参数,两个输出参数
注意:存储过程中参数顺序与定义中的参数顺序保持一致。
create or replace
PROCEDURE productdetail
(param_in1 in varchar2,
param_in2 in varchar2,
param_out1 out varchar2,
param_out2 out varchar2
)
as
begin
param_out1 := param_in1;
param_out2 := param_in2;
END productdetail;
返回结果集:Oracle中用游标返回结果集
注意:
1.关键字#ColumnResult所在位置标识了存储过程中游标out参数位置;
2.返回的结果集中应含有字段列表中添加的productid与productname字段。
create or replace
PROCEDURE productdetail
(param_in in varchar2, param_out out sys_refcursor)
is
begin
open param_out for 'select * from product where discontinued = :param_in1 ' using param_in;
END productdetail;
3.3.2 SQL Server存储过程举例:
返回单值: 假设一个输入参数,两个输出参数
注意:存储过程中参数顺序与定义中的参数顺序保持一致。
USE [report_test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[productdetail]
@param_in1 int,
@param_out1 int output,
@param_out2 nvarchar(20) output
AS
BEGIN
-- Insert statements for procedure here
SELECT @param_out1=ProductID,@param_out2=ProductName
FROM Products
WHERE ProductID=@param_in1;
END
返回结果集: 假设一个输入参数
注意:返回的结果集中应含有字段列表中添加的productid与productname字段。
USE [report_test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[productdetail]
@param_in1 int
AS
BEGIN
-- Insert statements for procedure here
SELECT *
FROM Products
WHERE Discontinued=@param_in1;
END
附:
问题:SQL Server存储过程中如果有临时表创建,可能会造成返回的结果集为空这种情况的发生。
解决方法:在存储过程中添加SET NOCOUNT ON语句