首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 存儲過程調用完全指南:JDBC 實戰與服務端實現

     編輯:DB2 教學

調用存儲過程的三步曲

  1. 建立連接: 載入驅動,獲取 Connection。
  2. 註冊輸出參數: 對 CallableStatement 的 OUT/INOUT 參數調用 registerOutParameter。
  3. 調用執行: 用 prepareCall("{call proc_name(?,?,?)}") 準備,設輸入參數,execute(),再取輸出值。

完整 Java 客戶端範例

import java.sql.*;

public class TestCallProc {
    public static void main(String[] args) {
        String url = "jdbc:db2://wellhope/sample";
        String user = "db2admin";
        String pwd  = "db2admin";

        try {
            Class.forName("COM.ibm.db2.jdbc.Net.DB2Driver").newInstance();
            Connection con = DriverManager.getConnection(url, user, pwd);
            con.setAutoCommit(false);

            // 準備調用 PRO_YHDL1(IN VARCHAR, IN VARCHAR, OUT INTEGER)
            CallableStatement cs = con.prepareCall("{call PRO_YHDL1(?,?,?)}");
            cs.registerOutParameter(3, Types.INTEGER);  // 註冊第3個參數為 OUT INTEGER

            cs.setString(1, "123");  // 輸入參數1
            cs.setString(2, "123");  // 輸入參數2
            cs.execute();

            int result = cs.getInt(3);  // 獲取輸出參數
            System.out.println("存儲過程返回: " + result);

            cs.close();
            con.close();
        } catch (SQLException ex) {
            while (ex != null) {
                System.err.println("SQLState: " + ex.getSQLState());
                System.err.println("Message:  " + ex.getMessage());
                System.err.println("Vendor:   " + ex.getErrorCode());
                ex = ex.getNextException();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

服務端存儲過程實現

DB2 支援 Java、SQL PL 等語言編寫存儲過程。以下為 Java 實現的 PRO_YHDL1:驗證用戶 ID/密碼,匹配則返回 1,否則 0。

import java.sql.*;

public class Pro_yhdl1 {
    public static void pro_yhdl1(String m_id, String m_pwd, int[] result)
            throws SQLException, Exception {

        // 使用默認連接(服務端上下文)
        Connection con = DriverManager.getConnection("jdbc:default:connection");
        PreparedStatement stmt = null;
        ResultSet rs = null;

        try {
            String sql = "SELECT PWD FROM DB2ADMIN.YHDL WHERE ID = ?";
            stmt = con.prepareStatement(sql);
            stmt.setString(1, m_id.trim());
            rs = stmt.executeQuery();

            String dbPwd = "";
            if (rs.next()) {
                dbPwd = rs.getString(1);
                if (rs.wasNull()) dbPwd = "";
                else dbPwd = dbPwd.trim();
            }

            result[0] = dbPwd.equals(m_pwd.trim()) ? 1 : 0;
        } finally {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (con != null) con.close();
        }
    }
}

關鍵注意點

  • 驅動類名: 老版本用 COM.ibm.db2.jdbc.Net.DB2Driver(Type 3),新版建議用 com.ibm.db2.jcc.DB2Driver(Type 4,JCC 驅動)。
  • 參數模式: Java 存儲過程的 OUT/INOUT 參數必須用數組或包裝類(如 int[]、String[])接收,標量無法帶回值。
  • 服務端連接: jdbc:default:connection 表示復用當前會話連接,無需重新認證。
  • 異常處理: DB2 可能拋出鏈式 SQLException,需用 getNextException() 遍歷。
  • 部署: 編譯為 JAR,放入 DB2 function/jar 目錄,執行 CALL SQLJ.INSTALL_JAR(...) 註冊,再 CREATE PROCEDURE ... EXTERNAL NAME 'class.method' LANGUAGE JAVA PARAMETER STYLE JAVA 定義。

總結

掌握 CallableStatement 三步驟、OUT 參數用數組接收、服務端用 jdbc:default:connection,即可高效調用 DB2 存儲過程。建議新項目統一遷移至 JCC Type 4 驅動,簡化配置並提升性能。

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