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

DB2 SQL 預存程序語法權威指南:CREATE PROCEDURE 完整語法圖與參數說明

     編輯:關於SqlServer

CREATE PROCEDURE (SQL) 完整語法結構

DB2 SQL 預存程序採用標準 SQL/PSM 風格語法,支援輸入/輸出/輸入輸出參數、動態結果集、決定性宣告、隔離等級控制等進階特性。

語法圖(簡化版)


CREATE PROCEDURE procedure-name
  ( [ parameter-declaration [, ...] ] )
  [ SPECIFIC specific-name ]
  [ DYNAMIC RESULT SETS integer ]
  [ MODIFIES SQL DATA | CONTAINS SQL | READS SQL DATA ]
  [ NOT DETERMINISTIC | DETERMINISTIC ]
  [ CALLED ON NULL INPUT ]
  [ INHERIT SPECIAL REGISTERS ]
  [ OLD SAVEPOINT LEVEL | NEW SAVEPOINT LEVEL ]
  [ LANGUAGE SQL ]
  [ EXTERNAL ACTION | NO EXTERNAL ACTION ]
  [ PARAMETER CCSID ASCII | UNICODE ]
  [ CONCURRENT ACCESS RESOLUTION USE CURRENTLY COMMITTED | WAIT FOR OUTCOME ]
  [ COMMIT ON RETURN YES | NO ]
  [ AUTONOMOUS | NO AUTONOMOUS ]
  routine-body

參數宣告語法


parameter-declaration ::= 
  [ IN | OUT | INOUT ] parameter-name data-type
  • IN:輸入參數(預設),呼叫端傳入值,程序內可讀不可寫回。
  • OUT:輸出參數,程序內賦值,呼叫端接收結果。
  • INOUT:輸入輸出參數,呼叫端傳入初始值,程序可修改並回傳。

核心選項詳細說明

選項說明預設值
SPECIFIC specific-name提供程序的唯一特定名稱,解決多載衝突系統自動產生
DYNAMIC RESULT SETS integer宣告程序可傳回的游標結果集數量(0 表示不傳回)0
MODIFIES SQL DATA程序執行 INSERT/UPDATE/DELETE/DDL--
CONTAINS SQL程序包含 SQL 但不讀寫資料(如 SET 變數、流程控制)--
READS SQL DATA程序僅執行 SELECT,不修改資料--
DETERMINISTIC相同輸入必然產生相同輸出,優化器可快取結果NOT DETERMINISTIC
CALLED ON NULL INPUT任一參數為 NULL 仍呼叫程序(需自行處理 NULL)CALLED ON NULL INPUT
INHERIT SPECIAL REGISTERS繼承呼叫端的特殊暫存器(如 CURRENT DATE、CURRENT PATH)INHERIT SPECIAL REGISTERS
OLD/NEW SAVEPOINT LEVEL儲存點層級隔離行為OLD SAVEPOINT LEVEL

完整範例:帶參數、動態結果集、交易控制


CREATE PROCEDURE GetEmployeeDetails (
  IN  p_dept_id   SMALLINT,
  OUT p_emp_count INTEGER,
  OUT p_avg_sal   DECIMAL(10,2)
)
SPECIFIC GetEmpDetails_v1
DYNAMIC RESULT SETS 1
READS SQL DATA
DETERMINISTIC
LANGUAGE SQL
BEGIN
  -- 宣告游標對應動態結果集
  DECLARE c_emp CURSOR WITH RETURN TO CLIENT FOR
    SELECT emp_id, emp_name, salary, hire_date
    FROM employees
    WHERE dept_id = p_dept_id
    ORDER BY emp_name;

  -- 計算彙總值
  SELECT COUNT(*), AVG(salary)
  INTO p_emp_count, p_avg_sal
  FROM employees
  WHERE dept_id = p_dept_id;

  -- 開啟游標傳回結果集
  OPEN c_emp;
END

呼叫方式


-- SQL 呼叫
CALL GetEmployeeDetails(10, ?, ?);

-- 應用程式 (JDBC/ODBC/CLI) 使用 CallableStatement
CallableStatement cs = conn.prepareCall("{CALL GetEmployeeDetails(?, ?, ?)}");
cs.setInt(1, 10);
cs.registerOutParameter(2, Types.INTEGER);
cs.registerOutParameter(3, Types.DECIMAL);
cs.execute();
int count = cs.getInt(2);
BigDecimal avgSal = cs.getBigDecimal(3);
ResultSet rs = cs.getResultSet(); // 取得動態結果集

與其他資料庫的關鍵差異

特性DB2SQL ServerOracle
語法標準SQL/PSM (ISO 標準)T-SQL (專有)PL/SQL (專有)
動態結果集DYNAMIC RESULT SETS + CURSOR WITH RETURN直接 SELECT 回傳SYS_REFCURSOR OUT 參數
參數模式IN/OUT/INOUT 明確宣告OUTPUT 關鍵字IN/OUT/IN OUT
決定性提示DETERMINISTIC 關鍵字無直接對應DETERMINISTIC
自主交易AUTONOMOUS無PRAGMA AUTONOMOUS_TRANSACTION

最佳實踐建議

  1. 明確宣告參數模式:避免預設 IN 導致輸出參數無法回傳。
  2. 善用 DETERMINISTIC:純計算/查詢程序標示決定性,助優化器快取。
  3. 限制動態結果集數量:僅在必要時宣告,減少網路傳輸開銷。
  4. 指定 SPECIFIC 名稱:方便後續 ALTER/DROP/GRANT 操作特定版本。
  5. 錯誤處理:使用 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION ... 捕捉 SQL 錯誤。
  6. 版本管理:預存程序腳本納入版控,部署使用 CREATE OR REPLACE PROCEDURE(DB2 9.7+ 支援)。

掌握 DB2 SQL 預存程序的標準語法與進階選項,能編寫可移植、高效能、易維護的資料庫端業務邏輯。

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