將 SQL 語句嵌入 C 代碼,通過預編譯器處理。關鍵標記:EXEC SQL 開頭,分號結尾。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>
EXEC SQL INCLUDE SQLCA; // 定義 SQLCA 通訊區
int main() {
EXEC SQL BEGIN DECLARE SECTION;
char firstname[13]; // 宿主變量:接收查詢結果
char userid[9]; // 宿主變量:連接用戶
char passwd[19]; // 宿主變量:密碼
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO sample USER :userid USING :passwd; // 連接數據庫
EXEC SQL SELECT FIRSTNME INTO :firstname
FROM employee WHERE LASTNAME = 'JOHNSON';
printf("First name = %s\n", firstname);
EXEC SQL CONNECT RESET; // 斷開連接
return 0;
}
| 組件 | 作用 | 關鍵點 |
|---|---|---|
EXEC SQL INCLUDE SQLCA | 引入 SQL 通訊區結構體 | sqlca.sqlcode 判斷執行狀態(0 成功,<0 錯誤,>0 警告) |
DECLARE SECTION | 聲明宿主變量作用域 | 只有此區變量可被 SQL 引用,前綴 : 区分 |
CONNECT TO | 建立數據庫會話 | 需實例已啟動;支持 USER :var USING :var 動態認證 |
SELECT ... INTO :var | 單行查詢結果綁定宿主變量 | 多行結果需用游標(DECLARE CURSOR/OPEN/FETCH/CLOSE) |
CONNECT RESET | 釋放連接資源 | 程序退出前必調用 |
db2 prep sample.sqc bindfile → 生成 .c 文件與綁定文件db2 bind sample.bnd → 綁定數據庫包gcc sample.c -o sample -ldb2 → 編譯鏈接./sampleEXEC SQL DECLARE c1 CURSOR FOR
SELECT FIRSTNME, LASTNAME FROM employee WHERE DEPT = :dept;
EXEC SQL OPEN c1;
while (1) {
EXEC SQL FETCH c1 INTO :fn, :ln;
if (sqlca.sqlcode == 100) break; // SQLCODE 100 = NOT FOUND
printf("%s %s\n", fn, ln);
}
EXEC SQL CLOSE c1;
char[n] 對應 VARCHAR)。sqlca.sqlcode,非零即錯誤/警告。\ 換行。ESQL 讓 C 程序以類似原生語法操作關係數據庫,核心在於宿主變量作為數據橋樑、SQLCA 狀態監控、預編譯器轉換。掌握單行查詢、游標循環、動態 SQL 三種模式即可覆蓋 90% 場景。本文基於 IBM DB2 ESQL 風格整理,其他數據庫(Oracle Pro*C、PostgreSQL ECPG)語法大同小異。