系列緒言
本系列對比 DB2 9.5 SQL PL 與 solidDB 6.3 SQL 過程語言。兩者均預編譯存儲,但語法與運行模型存在顯著差異。第一部分涵蓋結構、參數、變量/賦值、過程體、游標、動態 SQL。
1. 過程結構對比
| 特性 | DB2 SQL PL | solidDB |
| 核心結構 | 復合語句塊,關鍵字 BEGIN/END,支持嵌套/串行多塊 | 單一 BEGIN/END 對,無多塊嵌套 |
| 聲明順序 | 變量→條件→游標→處理器→邏輯(游標可在邏輯中任意位置) | 變量聲明在 BEGIN 後邏輯前,游標同 |
| 原子性 | BEGIN ATOMIC(全成功/全回滾)vs NOT ATOMIC(默認) | 事務可在過程內外提交/回滾,autocommit 環境下隱式提交 |
| SQL 前綴 | 無需前綴 | 所有 SQL 需 EXEC SQL 前綴 |
| 定義包裹 | 無 | 整個 CREATE PROCEDURE 定義需雙引號包裹 |
2. 參數機制
DB2
- 三模式:
IN、OUT、INOUT
- 支持陣列參數傳多組值
- 結果集通過打開游標返回,非參數定義
- 無默認值語法
solidDB
- 三模式:
IN、OUT、INOUT(默認 IN)
- 參數列表可指定默認值:
p1 INTEGER = 8
- 調用支持命名參數:
CALL proc(p1=8, p2, p3)
- 結果集通過
RETURNS 子句或 RETURN ROW 返回
3. 變量聲明與賦值
| 操作 | DB2 | solidDB |
| 聲明 | DECLARE v INT DEFAULT 0; | DECLARE v INT;(默認 NULL,無 DEFAULT 支持) |
| 賦值 | SET v = 1; | SET v = 1; 或 v := 1; |
| SELECT INTO | SELECT MAX(sal) INTO v FROM emp; | 需游標:EXEC SQL c1 INTO (v) EXECDIRECT SELECT MAX(sal) FROM emp; |
| 標量函數賦值 | VALUES CURRENT DATE INTO v; | SET v = {fn CURDATE()}; 或 v := {fn CURDATE()}; |
| 獲取影響行數 | GET DIAGNOSTICS v = ROW_COUNT; | SET v = SQLROWCOUNT;(特殊變量) |
4. 過程體支持的控制結構
| 結構 | DB2 | solidDB |
| 條件 | CASE(兩種形式)、IF | IF(CASE 僅在過程外支持) |
| 循環 | FOR、LOOP、REPEAT、WHILE | 僅 WHILE LOOP |
| 跳轉 | GOTO、ITERATE、LEAVE、RETURN | LEAVE(僅跳出最內層 WHILE) |
| 錯誤處理 | 條件/處理器聲明、SIGNAL/RESIGNAL | EXEC SQL WHENEVER、RETURN SQLERROR、DECLARE EXIT HANDLER |
| 結果集 | ASSOCIATE LOCATORS、ALLOCATE CURSOR | RETURN ROW 逐行構建、OPEN cursor RETURN ROW |
5. 游標機制深度差異
DB2:標準四步法
DECLARE c CURSOR FOR SELECT ...;
OPEN c;
FETCH FROM c INTO var;
CLOSE c;
solidDB:五步預備/執行模型
EXEC SQL PREPARE c SELECT ...; -- 解析優化,分配內存
EXEC SQL EXECUTE c INTO (var); -- 綁定輸入/輸出,執行
EXEC SQL FETCH c; -- 取行
EXEC SQL CLOSE c; -- 保留定義可重用
EXEC SQL DROP c; -- 釋放資源
關鍵差異點
- solidDB 變量作參數必須用游標(
USING 綁定 ? 佔位符),DB2 直接用變量
- solidDB 可重用已 PREPARE 游標提升性能,DB2 靜態 SQL 自動優化
- solidDB
USING 僅接受變量,字面量需在 PREPARE 時硬編碼
6. 動態 SQL
| 場景 | DB2 | solidDB |
| 即時執行 | EXECUTE IMMEDIATE stmt; | EXEC SQL EXECDIRECT stmt; |
| 預備/多次執行 | PREPARE s FROM stmt; EXECUTE s; | 天然即預備模型(見游標) |
| 字符串拼接 | || | +(SELECT 列表中也支持 ||) |
註:solidDB 無靜態 SQL,所有語句均屬動態,故其原生模型與 DB2 動態 SQL 更相似。
小結
DB2 SQL PL 更豐富、標準、面向復雜邏輯;solidDB 精簡、預備/執行分離、依賴 UDF/外部調用擴展。遷移時需重點改寫:游標模式、錯誤處理、循環結構、動態 SQL 拼接運算符。