以下範例示範如何建立一個簡單的 Oracle 存儲過程 test_pro3,該過程包含兩個 OUT 參數 x 和 y,分別指派為 20 和 30:
CREATE OR REPLACE PROCEDURE test_pro3(x OUT INT, y OUT INT)
IS
BEGIN
x := 20;
y := 30;
END;
建立完成後,可透過 all_source 視圖查詢該過程的定義:
SQL> SELECT text FROM all_source WHERE TYPE = 'PROCEDURE' AND name = 'TEST_PRO3';
TEXT
--------------------------------------------------------------------------------
PROCEDURE test_pro3(x OUT INT,y OUT int)
IS
BEGIN
x := 20;
y := 30;
END;
已選擇6行。
使用 JDBC 的 CallableStatement 即可呼叫上述存儲過程。以下為完整範例程式碼:
package votory;
import java.sql.*;
public class ConneDB {
public ConneDB() {}
public static void main(String[] args) {
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:SID";
Connection conn = null;
CallableStatement cstmt = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, "scott", "tiger");
// 準備呼叫存儲過程
cstmt = conn.prepareCall("{ call test_pro3(?,?) }");
// 註冊 OUT 參數型別
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.registerOutParameter(2, Types.INTEGER);
// 執行
cstmt.execute();
// 取得回傳值
String test = cstmt.getString(1);
String test2 = cstmt.getString(2);
System.out.println(test + " " + test2);
System.out.println("DONE..............");
} catch (SQLException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
// 關閉資源
try {
if (cstmt != null) cstmt.close();
if (conn != null) conn.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
20 30
DONE..............
透過這個簡單範例,您可以快速掌握 Oracle 存儲過程的建立、查詢以及在 Java 中呼叫的基本流程。