如何从Jasper Report调用存储过程?
答案 0 :(得分:2)
JasperReports Ultimate Guide
包含有关使用商店程序的信息:
必须满足某些条件才能将存储过程调用放入报表模板的SQL查询字符串中:
通过JDBC调用时,存储过程必须返回java.sql.ResultSet 存储过程不能有OUT参数。
答案 1 :(得分:2)
以下是使用iReport 4.5 / 4.5.1 JasperReport和使用Oracle Express数据库调用存储过程来构建报告的步骤....希望这有助于....
1.在您的iReport设计器中,转到工具 - >选项 - >在Classpath选项卡中,单击Add JAR并将OJDBC14.jar添加到类路径中。
2.转到Query Executer选项卡并设置以下语言:plsql Query Executer Factory:com.jaspersoft.jrx.query.PlSqlQueryExecuterFactory Fields Provider Class:com.jaspersoft.ireport.designer.data.fieldsproviders.SQLFieldsProvider
3.选择数据库JDBC连接
4.选择Oracle作为JDBC驱动程序,如下图所示,并通过单击“测试”按钮验证连接(确保选中“保存密码”复选框)
5.通过提供报告名称创建一个空白报告并保存。
6.在设计器中打开报告,右键单击报告名称,然后单击“编辑查询”
7.将查询语言设置为plsql
8.在{}中调用您的程序 {call PUBLISHER_AND_BOOKS(& P(P_PUBLISHER_ID),& P(ORACLE_REF_CURSOR))} 注意:P_PUBLISHER_ID的类型为字符串,ORACLE_REF_CURSOR的类型为java.sql.ResultSet数据类型自定义参数。您可以通过单击“新建参数”按钮来创建它。如果您有更多输入参数,请使用','作为分隔符,如上例所示。
9.单击“确定”继续进行报告设计。
10.在设计器窗口中右键单击Fields并添加单击Add Fields并确保所有字段名称与存储过程中的列名匹配
11.现在右键单击参数并添加与存储过程匹配的参数注意:请确保在我们的示例中为out参数取消选中“Use for Prompt”,其ORACLE_REF_CURSOR是out参数。
12.拖动并删除报告详细信息区域中的字段,如下所示
13.单击预览以运行报告,您将使用输入参数
提示所有步骤都通过图片详细捕获,并在下面的链接中提供,希望这有助于...
http://meezageekyside.blogspot.com/#!/2012/04/jasper-reports-ireport-45-using-oracle.html
答案 2 :(得分:1)
<queryString>
<![CDATA[Call procedure_name ($P{parm1},$P{parm2},"$P!{parm3}","$P!{parm4}","$P!{parm5}",$P{parm6},$P{parm7});]]>
</queryString>
使用MySQL您可以使用queryString调用存储过程,就像调用任何其他查询一样。
答案 3 :(得分:1)
以下是我解决这个问题的方法,您可以使用JR scriptlet(java bean)轻松完成此操作。 下面是示例java代码,一旦您将jar文件添加到jasper报告中 classpath并在报表属性中引用相同的内容。
- 访问变量/参数时,请确保使用报告中给出的标识名称 值和设置变量值(您不能设置参数值,只能设置变量值)
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();
}
}
}
&#13;
答案 4 :(得分:1)
非常简单: 1.标签大纲。右键单击文件jasper - &gt;选择数据集&amp;查询... 2.选择DB,语言plsql,&amp;跟随查询打电话 经验: {call packageName.procedureName($ P {a},$ P {b},$ P {c},$ P {d})}
祝你好运!答案 5 :(得分:0)
JasperReport不支持直接从他的SQL数据源调用存储过程/函数。我发现克服该限制的最佳方法是创建一个调用存储过程的Java bean(通过JDBC或Hibernate)并返回表示结果集的对象集合。如果您正在使用iReport,只需更改数据源表达式即可使用该Java bean。 (非免费)iReport手册中的数据源有很好的部分。
答案 6 :(得分:0)
从Jasper报告中调用过程的两种可能性,
如果您的过程返回了一些结果集,并且您希望如此 在报告中使用,那么你必须创建一个函数,类型和类型 用于调用过程的表(用于保存结果集)。
如果程序执行了一些DML操作,则可以直接调用 (没有功能)
答案 7 :(得分:0)
在jasper工作室(我使用v5.5.1)你可以像这样调用sp:
这是我的sp,它接受DateTime参数并返回一组结果
EXEC dbo.SP_Report @p1=$P{date_from}, @p2=$P{date_to}
答案 8 :(得分:0)
在使用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参数,如果使用cursor作为out参数,参数类应该是resultset(java.sql.ResultSet)