ESQL(Embedded SQL)是將 SQL 陳述式嵌入 C 程式碼中,經由預編譯器(ETE)轉換為標準 C/C++ 程式碼(呼叫 CCI 函式庫),再由 C 編譯器編譯連結成可執行檔。COBASE RDBMS 提供 ESQL 介面,結合 SQL 的集合操作與 C 的流程控制,開發高效能資料庫應用。
/* 1. 宣告區:定義主變數 */
EXEC SQL BEGIN DECLARE SECTION;
int sno;
char sname[20];
short status;
EXEC SQL END DECLARE SECTION;
/* 2. 通訊區:錯誤處理必備 */
EXEC SQL INCLUDE USERCA;
/* 3. 主程式 */
int main() {
/* 3.1 連線 */
EXEC SQL CONNECT "cobase:cobase";
/* 3.2 執行 SQL:DML、DDL、游標操作 */
EXEC SQL CREATE TABLE S_TEST (SNO CHAR(9), SNAME CHAR(20), STATUS INT, CITY CHAR(10));
EXEC SQL INSERT INTO S_TEST VALUES (:sno, :sname, :status, :city);
/* 3.3 提交/斷線 */
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
return 0;
}
EXEC SQL 開頭,以分號 ; 結束。:(如 :sno),純 C 程式碼中不加。
EXEC SQL SELECT sname, status INTO :sname, :status
FROM supplier WHERE sno = :sno;
EXEC SQL DECLARE c1 CURSOR FOR SELECT * FROM S_TEST FOR UPDATE;EXEC SQL OPEN c1; 建立作用集合EXEC SQL FETCH c1 INTO :sno, :sname, :status, :city; 逐列取出EXEC SQL CLOSE c1; 釋放資源FETCH 迴圈判斷 USERCA.sqlcode == 2000 表示無更多資料。
EXEC SQL DELETE FROM S_TEST WHERE CURRENT OF c1;
EXEC SQL UPDATE S_TEST SET status = :new_status WHERE CURRENT OF c1;
需在 DECLARE CURSOR 時加 FOR UPDATE。
EXEC SQL COMMIT; 提交目前邏輯工作單元EXEC SQL ROLLBACK; 回滾並還原EXEC SQL DISCONNECT; 釋放所有資源並斷線每個執行性 SQL 結束後,COBASE 將執行狀態寫入 USERCA:
struct user_com_area {
char caid[10]; // "USERCA"
long calen; // 結構長度
long sqlcode; // 0=成功, 2000=無資料/結束, <0=錯誤
long sqltype; // SQL 陳述式類型
int sqlerrmlen; // 錯誤訊息長度
char sqlerrmtext[80];// 錯誤訊息文字
// ... 其他警告旗標、統計計數等
} userca;
最佳實務:每條 SQL 執行後檢查 userca.sqlcode,非零即處理錯誤或記錄日誌。
.ec 為副檔名編寫 ESQL 原始檔。ETE filename(不含副檔名),產生 .cpp。.cpp。wetelib.lib wccilib.lib。Cobase.exe),初始化、選擇 Network Share 連線。.ec,記事本預設 .txt 會導致預編譯器找不到檔案。msflxgrd.ocx,請複製至 C:\Windows\System32\。ESQL 讓 C 開發者以熟悉的流程控制撰寫資料庫應用,配合 COBASE 的 USERCA 錯誤機制,能建構穩健的企業級系統。掌握預編譯流程、游標操作與交易控制,是高效開發的關鍵。