本範例示範如何使用 JDBC 連接 Oracle 資料庫,透過 CallableStatement 呼叫預存程序,並查詢執行結果。程式採用命令列參數傳入連線資訊,結構清晰分層。
import java.sql.*;
public class JDBCSTMConn {
private static String url = "";
private static String username = "";
private static String password = "";
// 取得資料庫連線
public Connection conn() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); // 載入驅動
Connection con = DriverManager.getConnection(url, username, password);
return con;
} catch (ClassNotFoundException cnf) {
System.out.println("driver not find:" + cnf);
} catch (SQLException sqle) {
System.out.println("can't connection db:" + sqle);
} catch (Exception e) {
System.out.println("Failed to load JDBC/ODBC driver.");
}
return null;
}
// 呼叫預存程序並查詢結果
public void execute(Connection con) {
CallableStatement toesUp = null;
try {
con.setAutoCommit(false); // 關閉自動提交
// 準備呼叫預存程序 p_test,帶一個整數參數
toesUp = con.prepareCall("{call p_test(?)}");
toesUp.setInt(1, 6); // 設定參數值
toesUp.executeQuery(); // 執行預存程序
// 查詢 TEST 表驗證結果
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM TEST");
while (rs.next()) {
String ID = rs.getString(1);
String NAME = rs.getString(2);
System.out.println(ID + " " + NAME);
}
rs.close();
} catch (SQLException e) {
System.out.println(e);
try { toesUp.close(); con.close(); } catch (Exception es) { System.out.println(es); }
}
}
// 示範流程
public void demo() {
try {
JDBCSTMConn oc = new JDBCSTMConn();
Connection conn = oc.conn();
oc.execute(conn);
conn.close();
} catch (SQLException se) { System.out.println(se); }
catch (Exception e) { System.out.println(e); }
}
// 主程式:接收 url、username、password 三個參數
public static void main(String[] arg) {
if (arg.length != 3) {
System.out.println("use: java JDBCSTMConn url username password");
return;
}
JDBCSTMConn oc = new JDBCSTMConn();
oc.url = arg[0];
oc.username = arg[1];
oc.password = arg[2];
oc.demo();
}
}
| 技術點 | 說明 |
|---|---|
CallableStatement | 專門用於呼叫預存程序,語法 {call procedure_name(?,...)} |
setInt(1, 6) | 設定第一個參數為整數 6,索引從 1 開始 |
con.setAutoCommit(false) | 關閉自動提交,配合交易控制(本範例未示範 commit/rollback) |
| Oracle 驅動類別 | oracle.jdbc.driver.OracleDriver(舊版),新版建議用 oracle.jdbc.OracleDriver |
| 參數化主程式 | 避免硬編碼連線資訊,部署更彈性 |
Statement、ResultSet 應在 finally 區塊關閉,建議使用 try-with-resources (Java 7+)setInt 外,尚有 setString、setDate、registerOutParameter(輸出參數)等DataSource + 連線池(如 HikariCP、Druid)替代 DriverManagerCREATE OR REPLACE PROCEDURE p_test (p_id IN NUMBER) AS
BEGIN
INSERT INTO TEST (ID, NAME) VALUES (p_id, 'Record_' || p_id);
COMMIT;
END;
/
掌握 CallableStatement 用法,能讓 Java 應用充分發揮資料庫端邏輯運算優勢,減少網路傳輸與應用層複雜度。