如何从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
感谢
答案 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)