內嵌 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 SECTION 與 END DECLARE SECTION 關鍵字所括住的區段之間。 每個主機變數名稱在內嵌 SQL 陳述式出現時,都會以冒號 (:) 開始。 冒號可讓先行編譯器區分主機變數與資料庫物件,例如具相同名稱的資料表與資料行。
資料類型 DBMS 與主機語言所支援的資料類型可能相當不同。 這會影響主機變數,因其扮演雙重角色。 一方面,主機變數是程式變數,由主機語言陳述式宣告及操作。 另一方面,內嵌 SQL 陳述式會用其來擷取資料庫資料。 若無對應至 DBMS 資料類型的主機語言類型,DBMS 會自動轉換資料。 不過,由於每個 DBMS 都有自己的規則以及與轉換流程關聯的特性,因此必須仔細選擇主機變數類型。
錯誤處理 DBMS 會透過 SQL 通訊區域或 SQLCA 將執行時間錯誤報告給應用程式程式。 在上述程式碼範例中,第一個內嵌 SQL 陳述式是 INCLUDE SQLCA。 這會告訴先行編譯器將 SQLCA 結構納入程式。 每當程式處理 DBMS 傳回的錯誤時,就需要這樣做。 WHENEVER...GOTO 陳述式會告訴先行編譯器,在發生錯誤時產生分支至特定標籤的錯誤處理程式碼。
單一資料庫 SELECT 用來傳回資料的陳述式是單一資料庫 SELECT 陳述式,即其僅會傳回單一資料列。 因此,程式碼範例不會宣告或使用資料指標。