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

DB2 進階開發精要:觸發器、存儲過程與 JDBC 實戰詳解

     編輯:DB2 教學

觸發器完整架構解析

建立觸發器需包含六大核心要素:

要素說明範例值
觸發器名稱唯一識別碼REORDER
觸發事件啟動操作類型INSERT / DELETE / UPDATE
啟動時機相對於事件執行順序BEFORE / AFTER
執行粒度作用範圍FOR EACH ROW / FOR EACH STATEMENT
轉換變數存取新舊資料OLD ROW / NEW ROW / OLD TABLE / NEW TABLE
觸發條件WHEN 子句過濾可包含子查詢與轉換變數
觸發本體執行邏輯一或多條 SQL 陳述式

實戰範例:庫存自動補貨觸發器

CREATE TRIGGER REORDER
AFTER UPDATE OF ON_HAND, MAX_STOCKED ON PARTS
REFERENCING NEW AS N_ROW
FOR EACH ROW MODE DB2SQL
WHEN (N_ROW.ON_HAND < 0.10 * N_ROW.MAX_STOCKED
  AND N_ROW.ORDER_PENDING = 'N')
BEGIN ATOMIC
  VALUES(ISSUE_SHIP_REQUEST(N_ROW.MAX_STOCKED - N_ROW.ON_HAND, N_ROW.PARTNO));
  UPDATE PARTS SET ORDER_PENDING = 'Y' WHERE PARTNO = N_ROW.PARTNO;
END

存儲過程開發與 Java 調用實戰

Java 調用三步驟法

  1. 建立連線:
    Class.forName("COM.ibm.db2.jdbc.net.DB2Driver").newInstance();
    Connection con = DriverManager.getConnection(url, user, password);
  2. 註冊輸出參數:
    CallableStatement cs = con.prepareCall("{call store_name(?,?,?)}");
    cs.registerOutParameter(3, Types.INTEGER);
  3. 執行與取回結果:
    cs.setString(1, "123");
    cs.setString(2, "123");
    cs.execute();
    int result = cs.getInt(3);

完整調用範例

import java.sql.*;

public class TestProc {
  public static void main(String[] args) {
    String url = "jdbc:db2://wellhope/sample";
    String user = "db2admin", password = "db2admin";
    
    try (Connection con = DriverManager.getConnection(url, user, password);
         CallableStatement cs = con.prepareCall("{call PRO_YHDL1(?,?,?)}")) {
      
      cs.registerOutParameter(3, Types.INTEGER);
      cs.setString(1, "123");
      cs.setString(2, "123");
      cs.execute();
      
      System.out.println("執行結果: " + cs.getInt(3));
    } catch (SQLException e) {
      while (e != null) {
        System.err.println("SQLState: " + e.getSQLState());
        System.err.println("Message: " + e.getMessage());
        System.err.println("ErrorCode: " + e.getErrorCode());
        e = e.getNextException();
      }
    }
  }
}

存儲過程實作範例(驗證使用者密碼)

import java.sql.*;

public class Pro_yhdl1 {
  public static void pro_yhdl1(String m_id, String m_pwd, int[] result) 
      throws SQLException, Exception {
    
    try (Connection con = DriverManager.getConnection("jdbc:default:connection");
         PreparedStatement stmt = con.prepareStatement(
           "SELECT PWD FROM DB2ADMIN.YHDL WHERE ID = ?")) {
      
      stmt.setString(1, m_id.trim());
      try (ResultSet rs = stmt.executeQuery()) {
        String dbPwd = "";
        if (rs.next()) dbPwd = rs.getString(1).trim();
        
        result[0] = dbPwd.equals(m_pwd.trim()) ? 1 : 0;
      }
    }
  }
}

JDBC 程式設計核心流程

  1. 載入驅動:Class.forName("COM.ibm.db2.jdbc.net.DB2Driver")
  2. 建立連線:DriverManager.getConnection(url)
  3. 建立 Statement:con.createStatement()
  4. 執行查詢:stmt.executeQuery("SQL")
  5. 處理結果集:
    • 取得中繼資料:rs.getMetaData()
    • 欄位數:rsmd.getColumnCount()
    • 欄位值:rsmd.getColumnLabel(i)
  6. 資源關閉:stmt.close(), con.close()

常用 ResultSet 設定選項

  • setMaxRows(int):限制最大回傳列數
  • setQueryTimeout(int):設定查詢逾時秒數
  • setEscapeProcessing(boolean):控制逸出字元處理

CLI(Call Level Interface)架構特性

  • 非新查詢語言,而是動態 SQL 的函式呼叫介面
  • 應用程式首次執行時提交動態 SQL 給資料庫系統
  • 函式可嵌入宿主語言(C/C++/COBOL 等)
  • 與 JDBC 同屬動態 SQL 處理機制,但 CLI 更貼近底層
  • 無需預編譯/聯編步驟,部署彈性高

開發選型建議

場景推薦技術理由
Java 應用快速開發JDBC標準化、物件導向、生態豐富
高效能 C/C++ 系統CLI低延遲、精細控制、無 JVM 開銷
複雜業務邏輯封裝存儲過程減少網路往返、資料庫端優化
資料完整性強制約束觸發器自動化、不可繞過、集中維護
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved