在深入學習 DB2 SQL 存儲過程之前,必須先理解「例程」的概念。例程是存在於伺服器端、按應用程序邏輯編寫的資料庫對象,可由客戶端或其他例程調用。DB2 中主要有三種類型的例程:
完全使用 SQL 編寫,通過 CREATE 語句註冊。這類例程被 DB2 視為「安全」的,可直接在資料庫引擎中運行,擁有優異的性能與擴展性,且實現速度極快。
使用 C、C++、Java、OLE 等語言編寫(存儲過程還支持 COBOL)。任何語言編寫的外部例程都可包含 SQL 語句。不同形式的例程之間可以相互調用,不受實現語言限制。
存儲過程通過 CALL 語句被客戶端或其他例程調用。調用雙方通過 CREATE PROCEDURE 語句中定義的參數交換數據,存儲過程還能向調用者返回多個結果集。
CALL 語句調用,無法直接在 SQL 語句中使用。本文重點介紹使用 SQL/SQL PL 編寫的存儲過程。其主要優勢在於:
存儲過程支持三種參數模式:
| 模式 | 說明 |
|---|---|
| IN | 向存儲過程傳入數據 |
| OUT | 存儲過程返回數據給調用者 |
| INOUT | 傳入數據並在執行過程中被返回值覆蓋 |
SQL 存儲過程通過游標向調用者傳遞結果集。必須為每個需返回的結果集聲明一個游標,並使用 WITH RETURN TO CALLER/CLIENT 指定返回對象:
TO CALLER:直接調用者可獲取結果集。TO CLIENT:只有最頂層的客戶端應用程序能獲取,中間層例程無法訪問。使用 DYNAMIC RESULT SETS 子句聲明預計返回的結果集數量,該數值存儲在 SYSCAT.ROUTINES 視圖的 RESULT_SETS 字段中。若實際返回數量超過聲明值,將發出警告(SQLCODE +464, SQLSTATE 0100E)。