簡體   English   中英

從存儲過程中獲取 Output 參數而不調用 execute()

[英]Get Output parameter from stored procedure without calling execute()

我想通過實體管理器從 Java 程序中調用 PL/SQL 存儲過程:

StoredProcedureQuery storedProcedureQuery = entityManager.createStoredProcedureQuery("someProcedure");

現在我的理解是,我必須在此 storedProcedureQuery 上調用 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,我們可以確認它每次測試只執行一次。 (正如我們在上面的例子中看到的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM