如何从java调用oracle函数

时间:2014-07-23 05:52:41

标签: java oracle function return-value

如何从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

的例外

感谢

4 个答案:

答案 0 :(得分:4)

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

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

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

如果您正在使用hibernate,请使用如下命名查询: 的 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文件中,只有在函数返回适当值时映射了返回值,才会应用返回类名和属性。

答案 1 :(得分:3)

使用来自休眠的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程序,您对函数余额的调用可能如下所示:

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

答案 2 :(得分:2)

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(?, ?, ?, ?, ?) }"; 

答案 3 :(得分:1)

您可以使用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)