1.4 存储过程数据集
概述
UniEAP Report支持存储过程数据源,即支持通过执行用户构建的存储过程查询语句获得报表数据的结果集。
存储过程数据源的使用方法
connection-config.xml文件配置
在当前引擎应用\WEB-INF\conf\unieap\connection\connection-config.xml文件中,添加数据源信息。例子如下:
<c3p0-connection name="northwind_ci">
<url>jdbc:oracle:thin:@10.4.53.89:1521:orcl</url>
<driverclass>oracle.jdbc.driver.OracleDriver</driverclass>
<user>northwind_ci</user>
<password>report_ci</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>
datasource.xml文件配置
在当前引擎应用\WEB-INF\conf\unieap\report\datasource.xml文件中,添加存储过程数据源信息。其中”northwind_ci”与”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_ci" Caption="Report30样例库"></DataSource>
</Category>
存储过程数据集的创建
创建SP类型数据集的步骤
(1)在数据集管理菜单上,点击“+”按钮,选择存储过程数据源,选择所配置的数据库,如下图所示:
(2)按照规定格式调用存储过程函数,如下图所示:
(3)点击"+加字段"按钮,添加对应的输出字段,如下图所示:
(4)点击确定按钮结束,即可查看新建的数据集,如图所示:
存储过程数据集的定义和使用方法
定义填写有两种方式:
(1)call procedureName($param_in1,$param_in2,…,#param_out1,#param_out2,...):用于返回单值。
(2)call procedureName($param_in1,$param_in2,…,#ColumnResult):用于返回结果集(注:oracle中以游标返回结果集也采用这种方式)。
- call是调用命令
- procedureName是数据库中存储过程的名称
- (…)中为参数
重要说明:
- 方式一,支持以$开头的输入参数(in参数)和以#开头的输出参数(out参数)。
- 方式二,使用关键字#ColumnResult标识,支持以$开头的输入参数(in参数)。
- 两种方式分别对应两种返回的结果:单值和结果集,即不能既返回单值,又返回结果集。
- in参数,存储过程的输入参数,等价于报表中的参数,在定义中只能以$param_in形式的报表参数填写。如下图所示,$p与参数p保持一致。
- out参数,存储过程通过输出参数来返回单值,可以返回多个out参数,用#+参数名(排除ColumnResult)表示,如#param。
- 关键字#ColumnResult(区分大小写)作用,(1)用于标识方式二。(2) oracle中以游标返回结果集应用时,标识存储过程中游标输出参数的位置。
参数的顺序,要与存储过程中参数的顺序一致。
如果定义采用方式一,即返回单值的情况:字段的名称和定义中的out参数名称保持一致(区分大小写),字段的类型与存储过程对应返回值类型保持一致。
- 如果定义采用方式二,即返回结果集的情况:字段的名称和存储过程中返回的结果集中字段名称保持一致,字段的类型与存储过程对应返回值类型保持一致。
存储过程写法举例
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;
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语句