
# 核心概念简介
嵌入式SQL-C程序开发，是指利用ecpg预编译器，在标准的C语言代码中直接插入SQL语句的编程方法。通过这种方式，开发者可以在单一源文件中，结合C语言的过程控制能力与SQL的数据处理能力，高效构建数据库应用程序。
在开始编写具体的嵌入式代码之前，了解以下基础概念将有助于您更好地组织程序：
#### C预处理器与ecpg预编译器
在嵌入式开发中，您的源码（.pgc）实际上要经历两道串行且独立的预处理工序。理解它们的分工至关重要：
1. ecpg预编译器作为第一道工序运行。它专门扫描源代码，提取所有以EXEC SQL引导的语句，并将其转换为调用底层库的标准C函数，最终生成一个临时.c文件。
2. 标准的C预处理器（包含在C编译器中）才开始接手这个生成的.c文件。它负责处理原生的C指令，如展开#include头文件和#define宏定义。
关于ecpg预编译器的详细功能，可以参考[ecpg预处理、编译、执行](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0295.html)。
#### 静态SQL和动态SQL
大多数应用程序设计用于处理静态SQL语句。在这种情况下，您在编译前就已经明确知道要执行哪些SQL命令、操作哪些表和列。然而，某些程序（如通用查询工具）可能直到运行时才能确定具体的SQL结构。动态SQL就是一种允许程序在运行时动态构建、接受并执行SQL语句的高级技术。
#### 宿主变量与数据类型
宿主变量是在C程序中声明的变量，用于在应用程序和数据库之间传递真实数据。例如，您可以将数据库查询的结果直接提取并存入宿主变量中，或者将宿主变量中的值作为参数插入到数据库表中。它是连接C语言数据空间与SQL语句执行的桥梁。
由于C语言的原生数据类型与数据库的SQL数据类型存在差异，宿主变量的使用强依赖于类型映射机制。开发者不仅需要利用宿主变量提取或插入数据，还必须遵循严格的映射规则，将数据库的特殊类型（如时间戳、字符串）安全地转换为C语言的初级或非初级（如结构体、数组）数据类型。
#### 游标（Cursors）
数据库的查询操作（SELECT）通常会返回多行数据，而C语言的普通变量在特定时刻只能保存单个值。游标就是用来解决这一差异的机制。通过声明游标，您的程序可以在结果集上打开一个"数据窗口"，然后按顺序逐行提取（FETCH）数据并进行处理。
#### 描述符区域（SQLDA）
当您使用最复杂的动态SQL技术时（即在编写代码时不仅不知道具体的SQL语句，甚至连查询会返回多少列、是什么数据类型都不知道），普通的宿主变量将无法满足需求。此时需要使用描述符区域（SQLDA）。它是一个高级的内存数据结构，允许程序在运行时动态地解析、分配和存储这些未知结构的数据。
#### 错误处理机制
嵌入式SQL语句在执行后，可能会成功、失败或产生警告。ecpg提供了两种主要的处理机制：SQLCA（SQL通信区）是一个全局数据结构，它向程序传递运行时的具体状态反馈（如错误码、受影响的行数），程序可根据反馈执行不同操作；WHENEVER语句则允许您指定当系统检测到错误或警告时要自动执行的动作，例如跳转到特定代码段、调用函数或直接退出程序。
