使用 StoredProcedureQuery 调用 Oracle 函数?

Posted

技术标签:

【中文标题】使用 StoredProcedureQuery 调用 Oracle 函数?【英文标题】:Calling Oracle function with StoredProcedureQuery? 【发布时间】:2014-09-03 16:27:45 【问题描述】:

我正在尝试使用 javax.persistence.StoredProcedureQuery 调用 Oracle PL/SQL 函数,但收到错误 PLS-00221: 'function_name' is not a procedure or is undefined

所以我假设不可能使用StoredProcedureQuery 调用 Oracle 函数?

我没有看到 JPA 提供调用函数的接口(与存储过程相反)。那么我该如何实现呢?

【问题讨论】:

Calling an oracle function from JPA的可能重复 试试this 【参考方案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);
         
     );

【讨论】:

是的,您可以执行将调用该函数的 SQL 查询。但我正在寻找一种直接调用函数的方法,就像您可以使用存储过程一样。 可以通过JDBC API实现,如方案2所示。

以上是关于使用 StoredProcedureQuery 调用 Oracle 函数?的主要内容,如果未能解决你的问题,请参考以下文章

未知方言支持 REF_CURSOR 参数

JPA 存储过程 NoSuchMethodError

如何使用inspect从Python中的被调用者那里获取调用者的信息?

[大数据性能调优] 第一章:性能调优的本质Spark资源使用原理和调优要点分析

使用rpcgen时,调用者如何找到被调用者?

spark性能调优04-算子调优