嵌入式 SQL 允許在 C 程序中直接編寫 SQL 語句,經預編譯器處理後生成純 C 代碼。以下是連接 SAMPLE 數據庫並查詢姓氏為 JOHNSON 的員工名的完整示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>
EXEC SQL INCLUDE SQLCA; /* (1) 定義 SQLCA 通訊區 */
int main() {
EXEC SQL BEGIN DECLARE SECTION; /* (2) 宿主變量聲明區 */
char firstname[13];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO sample; /* (3) 連接數據庫 */
EXEC SQL SELECT FIRSTNME INTO :firstname /* (4) 查詢並存入宿主變量 */
FROM employee WHERE LASTNAME = 'JOHNSON';
printf("First name = %s\n", firstname);
EXEC SQL CONNECT RESET; /* (5) 斷開連接 */
return 0;
}
EXEC SQL INCLUDE SQLCA;
SQLCA(SQL Communication Area)是應用程序與數據庫管理系統(DBMS)通訊的關鍵結構。其核心字段 SQLCODE 指示 SQL 語句執行結果:
0:成功執行> 0:執行成功但有警告(如截斷)< 0:執行失敗(錯誤碼)每條 SQL 執行後,應檢查 SQLCODE 進行錯誤處理。
EXEC SQL BEGIN DECLARE SECTION;
char firstname[13];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
INSERT/UPDATE 時將 C 數據傳給 DBMS;SELECT/FETCH 時從 DBMS 接收數據。:firstname),以區別於 SQL 列名。EXEC SQL CONNECT TO sample;
CONNECT TO sample USER :userid USING :passwd。
EXEC SQL SELECT FIRSTNME INTO :firstname
FROM employee WHERE LASTNAME = 'JOHNSON';
INTO :firstname 將查詢結果單行單列存入宿主變量。DECLARE CURSOR、OPEN、FETCH、CLOSE)。INSERT、UPDATE、DELETE。EXEC SQL CONNECT RESET;
釋放數據庫連接資源,程序結束前必須調用。
EXEC SQL 開頭,以分號 ; 結束。EXEC SQL 到 ; 之間的內容為 SQL 語句。\:
EXEC SQL SELECT col1, col2 \
INTO :var1, :var2 \
FROM table WHERE condition;
.sqc(或 .sc)源文件,包含嵌入式 SQL。db2 prep、proc),生成純 C 文件(.c)及綁定文件。
#define CHECK_SQLCA() \
do { \
if (sqlca.sqlcode < 0) { \
fprintf(stderr, "SQL Error %d at %s:%d\n", \
sqlca.sqlcode, __FILE__, __LINE__); \
EXEC SQL ROLLBACK; \
exit(1); \
} \
} while(0)
EXEC SQL CONNECT TO sample;
CHECK_SQLCA();
EXEC SQL SELECT ...;
CHECK_SQLCA();
封裝宏統一檢查 SQLCODE,確保錯誤不可被忽略,提高代碼健壯性。