內嵌 SQL 範例

下列程式碼是以 C 撰寫的簡單內嵌 SQL 程式。此程式說明許多 (但並非全部) 內嵌 SQL 技術。 程式會提示使用者輸入訂單號碼、擷取客戶號碼、銷售人員及訂單狀態,並在畫面顯示擷取的資訊。

int main() {  
   EXEC SQL INCLUDE SQLCA;  
   EXEC SQL BEGIN DECLARE SECTION;  
      int OrderID;         /* Employee ID (from user)         */  
      int CustID;            /* Retrieved customer ID         */  
      char SalesPerson[10]   /* Retrieved salesperson name      */  
      char Status[6]         /* Retrieved order status        */  
   EXEC SQL END DECLARE SECTION;  
  
   /* Set up error processing */  
   EXEC SQL WHENEVER SQLERROR GOTO query_error;  
   EXEC SQL WHENEVER NOT FOUND GOTO bad_number;  
  
   /* Prompt the user for order number */  
   printf ("Enter order number: ");  
   scanf_s("%d", &OrderID);  
  
   /* Execute the SQL query */  
   EXEC SQL SELECT CustID, SalesPerson, Status  
      FROM Orders  
      WHERE OrderID = :OrderID  
      INTO :CustID, :SalesPerson, :Status;  
  
   /* Display the results */  
   printf ("Customer number:  %d\n", CustID);  
   printf ("Salesperson: %s\n", SalesPerson);  
   printf ("Status: %s\n", Status);  
   exit();  
  
query_error:  
   printf ("SQL error: %ld\n", sqlca->sqlcode);  
   exit();  
  
bad_number:  
   printf ("Invalid order number.\n");  
   exit();  
}  

請注意下列關於此程式的資訊:

  • 主機變數 主機變數的宣告位置在 BEGIN DECLARE SECTIONEND DECLARE SECTION 關鍵字所括住的區段之間。 每個主機變數名稱在內嵌 SQL 陳述式出現時,都會以冒號 (:) 開始。 冒號可讓先行編譯器區分主機變數與資料庫物件,例如具相同名稱的資料表與資料行。

  • 資料類型 DBMS 與主機語言所支援的資料類型可能相當不同。 這會影響主機變數,因其扮演雙重角色。 一方面,主機變數是程式變數,由主機語言陳述式宣告及操作。 另一方面,內嵌 SQL 陳述式會用其來擷取資料庫資料。 若無對應至 DBMS 資料類型的主機語言類型,DBMS 會自動轉換資料。 不過,由於每個 DBMS 都有自己的規則以及與轉換流程關聯的特性,因此必須仔細選擇主機變數類型。

  • 錯誤處理 DBMS 會透過「SQL 溝通區域」或 SQLCA 向應用程式報告執行階段錯誤。 在上述程式碼範例中,第一個內嵌 SQL 陳述式是 INCLUDE SQLCA。 這會告訴先行編譯器將 SQLCA 結構納入程式。 每當程式處理 DBMS 傳回的錯誤時,就需要這樣做。 WHENEVER...GOTO 陳述式會告訴先行編譯器,在發生錯誤時產生分支至特定標籤的錯誤處理程式碼。

  • 單一資料庫 SELECT 用來傳回資料的陳述式是單一資料庫 SELECT 陳述式,即其僅會傳回單一資料列。 因此,程式碼範例不會宣告或使用資料指標。