簡體   English   中英

使用Java代碼啟動Oracle存儲過程

[英]Launch Oracle stored-procedure in Java code

我在Oracle中編寫了一個存儲過程,現在,我想用Java代碼啟動它。 我將描述一個問題。 我有一個對象類型:

TYPE PERSON_TYPE AS OBJECT (ID NUMBER(38), NAME VARCHAR2(20));

和表類型:

TYPE PERSON_TYPE_TABLE AS TABLE OF PERSON_TYPE;

我的程序看起來像這樣:

PROCEDURE EVALUATE_PERSON_PROC(P_PERSON_ID IN NUMBER, return_data OUT NOCOPY PERSON_TYPE_TABLE) 
AS
--Some code
BEGIN
--Some code
END;

如何在Java代碼中啟動此過程? 哪個班級最好?

您需要使用CallableStatement類

String sql = "{call EVALUATE_PERSON_PROC(?, ?)}";
CallableStatement statement = connection.prepareCall(sql);
...
statement.execute();

為什么不使用Spring的DAO抽象 (一個非常有用且相當輕量級的原始JDBC ,不需要樣板代碼),你可以StoredProcedure類。

class MySproc extends StoredProcedure {
    public MySproc(DataSource ds) {
       super(" { exec MY_SPROC ?, ? }", ds);
       declare(new SqlParameter("p1", Types.VARCHAR));
       declare(new SqlParameter("p2", Types.INT));
    }

    public void execute(String p1, int p2) {
        Map m = new HashMap();
        m.put("p1", p1);
        m.put("p2", p2);
        super.execute(m);
    }
}

然后執行非常簡單如下:

new MySproc(ds).execute("Hello", 12);

沒有數據庫Connection ,可以在任何地方看到CallableStatement 可愛! 哦,是的,它還提供基於注釋的Transaction

如果您的sproc返回一個表,使用Spring非常容易。 簡單聲明:

       declare(new SqlReturnResultSet("rs", mapper));

mapper是將ResultSet的一行轉換為所需對象的實例。 然后修改你的行:

        Map out = super.execute(m);
        return (Collection) out.get("rs");

返回的Collection將包含mapper實現創建的對象實例。

暫無
暫無

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

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