2014-07-23 84 views
2

如何從java中調用oracle函數?如何從java中調用oracle函數

我有一個預言函數aaa.fucntion(號碼,日期);,此方法返回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查詢?你嘗試了什麼,你卡在哪裏? –

+0

嗨@ErwinBolwidt,啓動服務器,將在幾分鐘內發佈堆棧跟蹤。 –

+0

@ErwinBolwidt,你現在可以看看編輯嗎? –

回答

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文件中,return cla ss名稱和屬性僅適用於已經映射返回值(如果函數返回適當的值)。

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

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