首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

JDBC 呼叫 Oracle 預存程序完整實作範例

     編輯:Java 程式設計入門

概述

本範例示範如何使用 JDBC 連接 Oracle 資料庫,透過 CallableStatement 呼叫預存程序,並查詢執行結果。程式採用命令列參數傳入連線資訊,結構清晰分層。

完整程式碼:JDBCSTMConn.java

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)替代 DriverManager
  • SQL 注入防護:預存程序本身有助防禦,但動態 SQL 仍需參數化

Oracle 預存程序範例(參考)

CREATE 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 應用充分發揮資料庫端邏輯運算優勢,減少網路傳輸與應用層複雜度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved