2014-09-03 58 views
0

我試圖調用使用javax.persistence.StoredProcedureQuery一個Oracle PL/SQL函數,我得到的錯誤PLS-00221: 'function_name' is not a procedure or is undefined使用StoredProcedureQuery調用Oracle函數?

所以我認爲它不可能叫使用StoredProcedureQuery一個Oracle的功能?

我沒有看到JPA提供了一個調用函數的接口(與存儲過程相反)。那麼我該如何實現它?

+1

的可能重複[從JPA調用oracle函數](http://stackoverflow.com/questions/5688152/calling-an-oracle-function-from-jpa) – 2014-09-03 19:20:00

+1

試試[this](http://stackoverflow.com/a/14722588)/599528) – user75ponic 2014-09-04 07:01:59

回答

1

樣品Oracle函數:

CREATE OR REPLACE FUNCTION f_get_random_number 
    RETURN NUMBER 
AS 
BEGIN 
    RETURN TRUNC(dbms_random.value(1,100)); 
END; 

解決方案1:使用SQL查詢

BigDecimal val = (BigDecimal)entityManager 
        .createNativeQuery("SELECT f_get_random_number FROM DUAL") 
        .getSingleResult(); 

解決方案2:使用JDBC API

Session session = entityManager.unwrap(Session.class);   
    Integer out = session.doReturningWork( 
     connection -> { 
     try (CallableStatement function = connection.prepareCall("{ ? = call f_get_random_number }")) { 
      function.registerOutParameter(1, Types.INTEGER); 
      function.execute(); 
      return function.getInt(1); 
     } 
    }); 
+0

是的,你可以執行一個SQL查詢來調用函數。但是我正在尋找一種直接調用函數的方式,就像您可以使用存儲過程一樣。 – Roland 2017-11-06 07:21:10

+0

它可以通過JDBC API實現,如解決方案2中所示。 – ukchaudhary 2017-11-06 07:43:29