如何从Jasper Report调用存储过程?

时间:2009-12-09 04:49:43

标签: jasper-reports

如何从Jasper Report调用存储过程?

9 个答案:

答案 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并在报表属性中引用相同的内容。

    - 访问变量/参数时,请确保使用报告中给出的标识名称 值和设置变量值(您不能设置参数值,只能设置变量值)

    &#13;
    &#13;
    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;
    &#13;
    &#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报告中调用过程的两种可能性,

    1. 如果您的过程返回了一些结果集,并且您希望如此 在报告中使用,那么你必须创建一个函数,类型和类型 用于调用过程的表(用于保存结果集)。

    2. 如果程序执行了一些DML操作,则可以直接调用     (没有功能)

    答案 7 :(得分:0)

    在jasper工作室(我使用v5.5.1)你可以像这样调用sp:

    1. 选择SQL作为语言
    2. 只执行你的sp并将参数传递给它
    3. 这是我的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)