【问题标题】:How to call oracle function from java如何从java调用oracle函数
【发布时间】:2014-07-23 05:52:41
【问题描述】:

如何从java中调用oracle函数?

我有一个oracle函数aaa.fucntion(number,date);,这个方法返回true或者false。如何从java中调用它并获取返回值?

我正在使用Hibernate

这是我尝试过的,

Session session = null;
            String associateHistorySQL="";

            try {
                session = HibernateUtil.currentSession();

                associateHistorySQL = "SELECT aa.myFunction(:aorId,:givenDate) from dual";

                Query associateHistoryQuery = session.createQuery(associateHistorySQL);

                associateHistoryQuery.setParameter("aorId", associateOfficeRecordId);
                associateHistoryQuery.setParameter("givenDate", date);

                List associateHistoryList = associateHistoryQuery.list();

                if (associateHistoryList != null && associateHistoryList.size() > 0 && new Integer(associateHistoryQuery.uniqueResult().toString()) > 0)
                    return true;
                else
                    return false;
            } finally {
                HibernateUtil.cleanUpHibernateFromDao(false);
            }

这是我得到的例外unexpected token: aa: line 1:1: unexpected token: aa

谢谢

【问题讨论】:

  • SQL 查询?你尝试过什么,你在哪里卡住了?
  • 嗨@ErwinBolwidt,已启动服务器,将在几分钟后发布堆栈跟踪。
  • @ErwinBolwidt,你现在能看看编辑吗??
  • 更好,但我们需要知道您遇到的错误/异常是什么。我们没有人可以运行它,因为我们没有您的数据库(在这种情况下这是可以理解的),但这意味着我们无法判断这段代码哪里出错了。
  • @ErwinBolwidt 更新了我得到的异常,谢谢

标签: java oracle function return-value


【解决方案1】:

实际上有多种方法可以做到这一点。但其中最简单的就是触发查询。 以下是操作方法。

String sql="select myFunction('"+number+"','"+date"') from dual";
statement.execute(sql);

如果您使用的是 JDBC,请设置输入和输出参数。

如果您使用休眠模式,请使用以下命名查询: YourMapping.hbm.xml

<sql-query name="my_function" callable="true">
<return alias="demo" class="net.bean.Demo">
<return-property name="id" column="id"/>
<return-property name="fname" column="fname"/>
<return-property name="lname" column="lname"/>
</return>
    {?=call demoFunc(:param1,:param2)}
</sql-query>

现在这将为函数创建一个命名查询

接下来要做的就是使用以下代码调用它

Query query=session.getNamedQuery("my_function");
query.setParameter("parma1",date);
query.setParameter("parma2",number);
query.executeUpdate();

请注意,在 hbm.xml 文件中存在的返回类名称和属性仅适用于您已映射返回值(如果函数返回适当的值)。

【讨论】:

    【解决方案2】:

    在休眠中使用session.doWork

    How to call a Oracle function from hibernate with return parameter?

    来自Oracle documentation -

    http://docs.oracle.com/cd/F49540_01/DOC/java.815/a64686/04_call5.htm

    FUNCTION balance (acct_id NUMBER) RETURN NUMBER IS
      acct_bal NUMBER;
    BEGIN
      SELECT bal INTO acct_bal FROM accts
        WHERE acct_no = acct_id;
      RETURN acct_bal;
    END;
    

    从 JDBC 程序中,您对函数 balance 的调用可能如下所示:

    CallableStatement cstmt = conn.prepareCall("{? = CALL balance(?)}");
    cstmt.registerOutParameter(1, Types.FLOAT);
    cstmt.setInt(2, acctNo);
    cstmt.executeUpdate();
    float acctBal = cstmt.getFloat(1);
    

    【讨论】:

      【解决方案3】:

      oracle函数:

      FUNCTION ap_ch_get_acct_balances (VAR_PI_MOB_NO_ACCT_NO VARCHAR2,
      VAR_REPLY_CODE OUT NUMBER, VAR_EXT_RESPONSE OUT VARCHAR2, VAR_PO_ACC_BAL OUT CHAR,
      VAR_PO_ACCT_NO OUT CHAR)  
      

      在java中调用:

      String call = "{ ? = call FCRLIVE.AP_CH_GET_ACCT_BALANCES(?, ?, ?, ?, ?) }"; 
      

      【讨论】:

        【解决方案4】:

        你可以使用 CallableStatement

        String sql="begin ? := aaaa.fucntion(?,?); end;";
        CallableStatement stmt = connection.prepareCall(sql);
        stmt.registerOutParameter(1, OracleTypes.BOOLEAN);
        stmt.setInt(2, number);
        stmt.setTimestamp(3, date);
        stmt.execute();
        

        之后你可以读取返回值:

        stmt.getBoolean(1)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多