嵌入式 SQL 示例

以下代码是一个简单的嵌入式 SQL 程序,以 C 语言编写。该程序说明了许多嵌入式 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 语句;也就是说,它只返回一行数据。 因此,代码示例不声明或使用游标。