首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

混合式程式設計:嵌入式 SQL 與主語言溝通機制詳解

     編輯:關於SqlServer

兩種計算模型的橋樑

嵌入式 SQL 將 SQL 陳述式嵌入高階語言(C、Cobol、Fortran 等),程式中共存兩種模型:

  • SQL:宣告式、集合導向,負責資料庫操作。
  • 主語言:程序式、記錄導向,負責流程控制。

三大溝通機制解決模型不匹配:

一、SQL 通訊區 (SQLCA)

SQLCA (SQL Communication Area) 是預先定義的資料結構,每次 SQL 執行後,DBMS 將狀態碼、錯誤訊息、列計數等回填至此。應用程式檢查 SQLCODE(或 SQLSTATE)決定後續流程。

EXEC SQL INCLUDE SQLCA;  -- 定義 SQLCA

EXEC SQL DELETE FROM emp WHERE dept = :dno;
IF SQLCODE = 0 THEN      -- 成功
   ...
ELSE IF SQLCODE = 100 THEN  -- 無符合列
   ...
ELSE                      -- 其他錯誤
   ...
END IF;

典型回饋:違反約束拒絕、無列刪除、成功刪除並回傳筆數、無條件刪除警告、執行錯誤。

二、主變數

主語言變數在 SQL 中使用,前綴冒號 : 識別。

類型方向用途
輸入主變數主語言 → SQL提供參數值(WHERE col = :var)。
輸出主變數SQL → 主語言接收查詢結果(INTO :var1, :var2)。
輸入/輸出雙向同一變數先輸入後輸出。

指示變數

整數變數,緊跟主變數後(:var :ind),用途:

  • 輸入時:ind = -1 表示傳遞 NULL 值。
  • 輸出時:ind = -1 表示接收到 NULL;ind > 0 表示值被截斷(長度為 ind)。

宣告區段


EXEC SQL BEGIN DECLARE SECTION;
   char emp_name[64];
   long emp_id;
   short emp_id_ind;  -- 指示變數
EXEC SQL END DECLARE SECTION;

三、游標

解決「集合導向 SQL 產生多列」與「記錄導向主語言一次處理一列」的不匹配。

完整範例(C 語言嵌入式 SQL)


#include 
#include 

EXEC SQL BEGIN DECLARE SECTION;
   char dept_name[64];
   char emp_no[64], emp_name[64], emp_sex[64];
   int  emp_age, new_age;
   long SQLCODE;
EXEC SQL END DECLARE SECTION;

EXEC SQL INCLUDE sqlca;

int main() {
   int count = 0; char yn;
   printf("Dept (CS/MA/IS): "); scanf("%s", dept_name);

   EXEC SQL CONNECT TO 'HP-08D6CXF128B\SQL2000' USER 'sa';

   EXEC SQL DECLARE SX CURSOR FOR
      SELECT emp_no, emp_name, emp_sex, emp_age
      FROM employee
      WHERE dept = :dept_name;

   EXEC SQL OPEN SX;

   for (;;) {
      EXEC SQL FETCH SX INTO :emp_no, :emp_name, :emp_sex, :emp_age;
      if (sqlca.sqlcode != 0) break;  -- SQLCODE=100 表示無更多列

      if (count++ == 0) printf("%-10s %-20s %-10s %-10s\n", "No", "Name", "Sex", "Age");
      printf("%-10s %-20s %-10s %-10d\n", emp_no, emp_name, emp_sex, emp_age);

      printf("UPDATE AGE (y/n)? ");
      do { scanf(" %c", &yn); } while (yn!='Y'&&yn!='y'&&yn!='N'&&yn!='n');
      if (yn=='Y'||yn=='y') {
         printf("NEW AGE: "); scanf("%d", &new_age);
         EXEC SQL UPDATE employee SET emp_age = :new_age WHERE CURRENT OF SX;
      }
   }

   EXEC SQL CLOSE SX;
   EXEC SQL COMMIT WORK;
   EXEC SQL DISCONNECT;
   return 0;
}

關鍵點總結

  1. SQLCA 是錯誤處理與流程控制的核心,每個 SQL 後必須檢查。
  2. 主變數 以冒號區分於資料庫物件,指示變數處理 NULL/截斷。
  3. 游標 以 DECLARE → OPEN → FETCH → (UPDATE/DELETE WHERE CURRENT OF) → CLOSE 生命週期,逐列處理結果集。
  4. WHERE CURRENT OF cursor 實現精確定位更新,避免 WHERE 條件不唯一風險。
  5. 預處理器將 EXEC SQL 區塊轉換為呼叫資料庫客戶端庫的函式呼叫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved