首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从存储过程中获取输出参数,而不调用execute()

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

Stack Overflow用户
提问于 2020-08-01 10:13:00
回答 1查看 2.1K关注 0票数 4

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

代码语言:javascript
运行
复制
StoredProcedureQuery storedProcedureQuery = entityManager.createStoredProcedureQuery("someProcedure");

现在,我的理解是,我必须在这个storedProcedureQuery上调用execute(),以便执行该过程并能够检索OUT参数。但是,我可以检索这些值,而无需调用execute()-Method,只需调用

代码语言:javascript
运行
复制
someValue1 = (Integer)storedProcedureQuery.getOutputParameterValue(1);
someValue2 = (Integer)storedProcedureQuery.getOutputParameterValue(2);

这怎么可能?存储过程将在什么时候在这个代码段中执行?当调用()时,是否每一次都会执行该过程?是否有任何关于这种行为的官方文件?

EN

回答 1

Stack Overflow用户

发布于 2020-08-01 13:28:06

我是他这个领域的新手,对这个问题和你一样好奇。但是我利用这个机会来测试它,下面是我的观察,

代码语言:javascript
运行
复制
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 )调用实际执行的确切位置。

此外,执行发生了多少次,我通过在调用过程中插入另一个表来测试它。

代码语言:javascript
运行
复制
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,我们可以确认每个测试只执行一次。(正如我们在上面的例子中看到的)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63204077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档