【发布时间】:2018-04-29 16:53:47
【问题描述】:
如何从 Jasper Report 中调用存储过程?
【问题讨论】:
标签: jasper-reports
如何从 Jasper Report 中调用存储过程?
【问题讨论】:
标签: jasper-reports
JasperReports Ultimate Guide 包含有关使用存储过程的信息:
必须满足某些条件才能将存储过程调用放入报表模板的 SQL 查询字符串中:
存储过程在通过 JDBC 调用时必须返回 java.sql.ResultSet。
存储过程不能有 OUT 参数。
【讨论】:
以下是调用存储过程以使用 iReport 4.5/4.5.1 JasperReport 和使用 Oracle Express 数据库构建报告的步骤....希望对您有所帮助....
1.在您的 iReport 设计器中转到工具 --> 选项 --> 并在类路径选项卡中单击添加 JAR 并将 OJDBC14.jar 添加到类路径中。
2.转到查询执行器选项卡并设置以下语言:plsql 查询执行器工厂:com.jaspersoft.jrx.query.PlSqlQueryExecuterFactory 字段提供程序类:com.jaspersoft.ireport.designer.data.fieldsproviders.SQLFieldsProvider
3.选择数据库JDBC连接
4. 如下图所示选择 Oracle 作为 JDBC 驱动程序,然后单击“测试”按钮验证连接(确保选中“保存密码”复选框)
5.通过提供报告名称创建空白报告并保存。
6.在设计器中打开报表,右击报表名称,点击编辑查询
7.设置查询语言为plsql
8. 使用 in { } 调用您的程序 {调用 PUBLISHER_AND_BOOKS(&P(P_PUBLISHER_ID), &P(ORACLE_REF_CURSOR))} 注意:P_PUBLISHER_ID 是字符串类型,ORACLE_REF_CURSOR 是 java.sql.ResultSet 数据类型自定义参数类型。您可以通过单击“新建参数”按钮来创建它。如果您有更多输入参数,请使用“,”作为分隔符,如上例所示。
9.单击“确定”并继续进行报表设计。
10.在设计器窗口中右键单击字段并添加单击添加字段并确保所有字段名称与存储过程中的列名称匹配
11.现在右键单击参数并添加与存储过程匹配的参数注意:确保取消选中属性中的“用于提示”,在我们的示例中,它的 ORACLE_REF_CURSOR 是 out 参数。
12.如下图所示拖拽报表详情带中的字段
13.点击预览运行报表会提示输入参数
所有步骤都用图片详细记录,可以在下面的链接中找到,希望对您有所帮助...
http://meezageekyside.blogspot.com/#!/2012/04/jasper-reports-ireport-45-using-oracle.html
【讨论】:
<queryString>
<![CDATA[Call procedure_name ($P{parm1},$P{parm2},"$P!{parm3}","$P!{parm4}","$P!{parm5}",$P{parm6},$P{parm7});]]>
</queryString>
在 MySQL 中,您可以像调用任何其他查询一样调用存储过程,使用 queryString。
【讨论】:
这是我解决问题的方法,您可以使用 JR scriptlet (java bean) 轻松做到这一点。 下面是示例 java 代码,一旦你有了 jar 文件,就将它添加到 jasper 报告中 类路径并在您的报告属性中引用相同的内容。
-- 请确保在访问变量/参数时使用报告中给出的相同名称 值和设置变量值(您不能设置参数值,只能设置变量)
package com.scriptlets;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;
public class Icdf extends JRDefaultScriptlet {
public void afterReportInit() throws JRScriptletException {
// get the current connection from report via parameters
Connection conn = (Connection) this
.getParameterValue("REPORT_CONNECTION");
int userId = 100; //use this.get__ to access from report
try {
if (conn != null)
callOracleStoredProcOUTParameter(conn, userId); // SP call
} catch (SQLException e) {
e.printStackTrace();
}
}
private void callOracleStoredProcOUTParameter(Connection conn, int userId)
throws SQLException {
CallableStatement callableStatement = null;
String getDBUSERByUserIdSql = "{call someStoredProcedureName(?,?,?)}";
try {
callableStatement = conn.prepareCall(getDBUSERByUserIdSql);
// setting parameters of the callablestatement
callableStatement.setInt(1, userId);
callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(3, java.sql.Types.DATE);
// execute getDBUSERByUserId store procedure
callableStatement.executeUpdate();
// get the required OUT parameters from the callablestatement
String userName = callableStatement.getString(2);
Date createdDate = callableStatement.getDate(3);
// --just to check, you can view this on iReport console
System.out.println("UserName : " + userName + "CreatedDate : " + createdDate);
// set the values to report variables so that you can use them in
// the report
this.setVariableValue("variable_name1", userName);
this.setVariableValue("variable_name2", createdDate);
} catch (SQLException e) {
e.printStackTrace();
} catch (JRScriptletException e) {
e.printStackTrace();
}
}
}
【讨论】:
非常简单: 1. 在标签轮廓处。右键单击文件 jasper --> 选择 Dataset & Query ... 2. 选择数据库,语言 plsql,并使用查询调用 经验: {调用 packageName.procedureName($P{a}, $P{b}, $P{c}, $P{d}) }
祝你好运!
【讨论】:
JasperReport 不支持直接从他的 SQL 数据源调用存储过程/函数。我发现克服这个限制的最好方法是创建一个 Java bean,它调用存储过程(通过 JDBC 或 Hibernate)并返回代表结果集的对象集合。如果您使用 iReport,只需更改数据源表达式以使用该 Java bean。在(不是免费的)iReport 手册中有很好的数据源部分。
【讨论】:
从 Jasper 报告中调用过程的两种可能性,
如果您的过程返回一些结果集并且您希望 在报告中使用,那么你必须创建一个函数,类型和类型 用于调用过程的表(用于保存结果集)。
如果程序做了一些DML操作,那么你可以直接调用 (没有函数)
【讨论】:
在 jasper studio(我使用的是 v5.5.1)中,您可以像这样调用 sp:
这是我的 sp,它接受 DateTime 参数并返回一组结果
EXEC dbo.SP_Report @p1=$P{date_from}, @p2=$P{date_to}
【讨论】:
在使用 queryString 的 jasper 报告中,我们可以调用这样的过程
示例:
<![CDATA[{call PACKAGE.PROCEDURENAME($P{PARAM_NAME1},$P{PARAM_NAME2},$P{PARAM_NAME3},$P{PARAM_NAME4},$P{PARAM_NAME5},$P{PARAM_NAME6},$P{PARAM_NAME7},$P{OUT_PARAM_NAME8})}]]>
我们可以传递 IN 和 OUT 参数,如果你使用游标作为输出参数,参数类应该是结果集(java.sql.ResultSet)
【讨论】: