2014-09-03 96 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