核心概念简介
嵌入式SQL-C程序开发,是指利用ecpg预编译器,在标准的C语言代码中直接插入SQL语句的编程方法。通过这种方式,开发者可以在单一源文件中,结合C语言的过程控制能力与SQL的数据处理能力,高效构建数据库应用程序。
在开始编写具体的嵌入式代码之前,了解以下基础概念将有助于您更好地组织程序:
C预处理器与ecpg预编译器
在嵌入式开发中,您的源码(.pgc)实际上要经历两道串行且独立的预处理工序。理解它们的分工至关重要:
- ecpg预编译器作为第一道工序运行。它专门扫描源代码,提取所有以EXEC SQL引导的语句,并将其转换为调用底层库的标准C函数,最终生成一个临时.c文件。
- 标准的C预处理器(包含在C编译器中)才开始接手这个生成的.c文件。它负责处理原生的C指令,如展开#include头文件和#define宏定义。
关于ecpg预编译器的详细功能,可以参考ecpg预处理、编译、执行。
静态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语句则允许您指定当系统检测到错误或警告时要自动执行的动作,例如跳转到特定代码段、调用函数或直接退出程序。