java - 从存储过程中获取输出参数而不调用 execute()

标签 java sql stored-procedures plsql entitymanager

我想通过实体管理器从 Java 程序中调用 PL/SQL 存储过程:

StoredProcedureQuery storedProcedureQuery = entityManager.createStoredProcedureQuery("someProcedure");
现在我的理解是,我必须在这个存储过程查询上调用 execute() 才能执行该过程并能够检索 OUT 参数。但是,我可以检索这些值 没有 通过简单地调用来调用 execute()-Method
someValue1 = (Integer)storedProcedureQuery.getOutputParameterValue(1);
someValue2 = (Integer)storedProcedureQuery.getOutputParameterValue(2);
这怎么可能 ?此代码片段中的存储过程究竟何时执行?是否会执行程序调用 getOutputParameterValue() 的时间?这种行为是否有任何官方文档?

最佳答案

我是他所在领域的新手,对这个问题和你一样好奇。然而,我已经借此机会对其进行了测试,以下是我的观察,

According to the documentation execute() returns:
> Return true if the first result corresponds to a result set,
> and false if it is an update count or if there are no results
> other than through IN OUT and OUT parameters, if any.
因此我会说,返回的 true 或 false 并不意味着执行成功或不执行。
在调用 getOutputParameterValue 之前,我们必须再次注册参数。 .如果我们查看 getOutputParameterValue 的实现,我们将能够准确找到 hibernate 提供程序(在我的情况下为 JPA)调用实际执行的位置。
除了执行发生了多少次之外,我以一种通过插入到调用过程中的另一个表来检查它的方式对其进行了测试。
create table test_procedure_call(msg varchar2(100));

CREATE OR REPLACE PROCEDURE test (
    p_in_1  IN    NUMBER,
    p_out_1 OUT   VARCHAR2,
    p_out_2 OUT   VARCHAR2
) AS
BEGIN
    insert into test_procedure_call values ('Executed..');
    commit;
    select 'FirstName'||' '||'LastName','HR' into p_out_1,p_out_2 
      from dual 
     where p_in_1=1;
END;
/

@Test
    public void testStoredProcedureQuery() {
        StoredProcedureQuery sp = em.createStoredProcedureQuery("test");
        // set parameters
        sp.registerStoredProcedureParameter("p_in_1", Integer.class, ParameterMode.IN);
        sp.registerStoredProcedureParameter("p_out_1", String.class, ParameterMode.OUT);
        sp.registerStoredProcedureParameter("p_out_2", String.class, ParameterMode.OUT);
        sp.setParameter("p_in_1", 1);

        String name = sp.getOutputParameterValue("p_out_1").toString();
        String dept = sp.getOutputParameterValue("p_out_2").toString();

        System.out.println("Name : " + name);
        System.out.println("Department : " + dept);
    }

select * from test_procedure_call;

MSG                                                                                                 
----------------------------------------------------------------------------------------
Executed..
通过表中的 test_procedure_call,我们可以确认它每次测试只执行一次。 (正如我们在上面的例子中看到的)。

关于java - 从存储过程中获取输出参数而不调用 execute(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63204077/

相关文章:

java - 正则表达式从 founded 关键字替换为 next &

java - GoogleAPIClient 已弃用 - 如何实现新的 GoogleSignInOptions?

sql - 用于 SQL Server 数据库访问的基于 Web 的托管管理工具

.net - SQL Server - XML 验证 : Invalid simple type value

c# - bool doesExist = command.ExecuteScalar() != null 由于某种原因不断评估为 true

c# - 从 C# 中的数据库层调用存储过程

java - 计算平均值,字符串标记化练习

java - springboot 返回 responseentity 返回 JSON

java - 如何在表中没有索引且无需重新部署项目的情况下加速 sql 查询

mysql - 仅当存储过程运行两次时,它才会返回完整的结果集