2011-12-13 102 views
2

在Oracle 11g中,我有一個表survey,其屬性爲id,titlemessage。下面的存儲過程根據提供的ID獲取單個記錄,並將其存儲在提供的OUT參數中。如何在java中引用表%rowtype的oracle pl/sql out參數

create or replace procedure get_survey(arg_id number, obj_survey out survey%rowtype) is 
begin 
    select * into obj_survey from survey where id = arg_id; 
end get_survey; 

我需要從Java調用這個存儲過程,我知道我可以用CallableStatement開始,但我怎麼通過從Java考慮它必須是survey%rowtype類型的OUT參數?我知道我可以使用光標,但我認爲這不是一個好習慣,因爲我只檢索一行。另外,我需要從OUT參數創建一個Survey對象(PO​​JO),並從方法中返回它。這裏有多遠我在代碼中已經得到了目前:

public Survey getSurvey(int id) throws SQLException { 
    CallableStatement stmt = conn.prepareCall("begin get_survey(?, ?); end;"); 
    stmt.setInt(1, id); 
    stmt.registerOutParameter(2, OracleTypes.[okay what do i put here?]); // not sure about this line either 
    stmt.execute(); 

    // get the out parameter, convert it to a Survey object type and return it 

} 

回答

1

「行類型」下面是一個Oracle PL/SQL特定類型的,我不認爲它會通過JDBC支持。快速搜索oracle論壇(谷歌「jdbc rowtype網站:oracle.com」)建議相同。你可能最好返回一個遊標,或者直接從JDBC執行SQL。

+0

我是否認爲儘管使用遊標將保留在Oracle端存儲所有邏輯的目標,但是直接從JDBC執行SQL會更快嗎? –

+1

在JDBC中直接執行SQL更快是正確的 –

0
cstmt = conn.getNewCallableStatement("{call MY_PLSQL_PACKAGE.MY_PROC(?,?,?)}"); 
     cstmt.setString(1, stringOutput1); 
     cstmt.setString(2, stringOutput2); 
     cstmt.registerOutParameter(3, OracleTypes.CURSOR); 
     cstmt.execute; 
0

不幸的是,你不能在JDBC連載一個PL/SQL RECORD類型,但是你可以通過執行匿名PL/SQL塊樣解決這個限制這樣的:

DECLARE 
    obj_survey survey%rowtype; 
BEGIN 
    get_survey(?, obj_survey); 

    ? := obj_survey.id; 
    ? := obj_survey.x; 
    ? := obj_survey.y; 
    ... 
    -- continue this for all attributes in survey 
END; 

您現在可以使用以下CallableStatement

try (CallableStatement s = conn.createCall(" [ ... above PL/SQL ... ] ")) { 
    s.setInt(1, id); 
    s.registerOutParameter(2, Types.INTEGER); 
    s.registerOutParameter(3, Types.VARCHAR); 
    s.registerOutParameter(4, Types.DATE); 
    ... 
    // Repeat for all attributes 

    s.execute(); 

    int id = s.getInt(2); 
    String x = s.getString(3); 
    Date y = s.getDate(4); 
    ... 
    // Repeat for all attributes 
} 

I've recently written about this technique in a blog post,這也解釋瞭如何爲所有PL/SQL RECORD類型自動生成這些PL/SQL塊。