如何从Java调用Oracle函数

3

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

谢谢。


1
一条SQL查询语句?你尝试过什么,卡在哪里了? - Erwin Bolwidt
嗨@ErwinBolwidt,服务器已启动,我会在几分钟内发布堆栈跟踪。 - Java Questions
@ErwinBolwidt,你能看一下现在的编辑吗? - Java Questions
@ErwinBolwidt更新了我的异常,谢谢。 - Java Questions
@NinadPingale发现了重复项-你的问题实际上就是描述在那个问题中。你正在向一个只接受HQL的Hibernate函数发送一个原始SQL查询。这个重复项描述了如何将一个原始的SQL函数调用与Hibernate结合使用。 - Erwin Bolwidt
显示剩余3条评论
5个回答

5

实际上有多种方法可以做到这一点,但最简单的方法是发出查询。

以下是如何操作:

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文件中,返回的类名和属性仅适用于您已映射了返回值且函数返回适当的值。

4

使用hibernate的session.doWork方法。

如何在hibernate中调用带返回参数的Oracle函数?

参考Oracle文档 -

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);

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

1
你可以使用CallableStatement。
String sql="begin ? := aaaa.function(?,?); end;";
CallableStatement stmt = connection.prepareCall(sql);
stmt.registerOutParameter(1, OracleTypes.BOOLEAN);
stmt.setInt(2, number);
stmt.setTimestamp(3, date);
stmt.execute();

之后,您可以使用以下代码读取返回值:
stmt.getBoolean(1)

0

// Oracle函数

create or replace function addtwono(a in number, b in number) return varchar2 is
Result varchar2(10);
begin
result:= a + b;
--c:= result;
return('SUCCESS');
end ;

// Java Code ==========================================
String query = "begin ? := user.addtwono(?,?); end;";
CallableStatement st = connection.prepareCall(query);
st.registerOutParameter(1, OracleTypes.VARCHAR);
st.setInt(2, 10);
st.setInt(3, 15);
st.execute();
String rtn = st.getString(1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接