我最近在维护一个使用 C 语言和 Oracle 数据库的老系统时,发现大量 SQL 语句直接写在程序中。
当时我对这种写法很好奇:它既不像 JDBC、也不是 ORM 框架。
深入研究后,我发现这其实是 嵌入式 SQL(Embedded SQL, 简称 E-SQL) —— 一种在程序源代码中直接编写 SQL 的技术。

本文主要面向 想了解数据库底层访问机制 的开发者,尤其是仍需维护旧系统或对数据库与语言集成机制感兴趣的同学。
我将结合实例,介绍 E-SQL 的原理、结构、常用语法以及在不同数据库系统中的实现差异。


一、什么是嵌入式 SQL(Embedded SQL)

嵌入式 SQL 是一种让开发者在高级语言(如 C、COBOL、FORTRAN 等)中直接编写 SQL 语句的技术。
它的目标很明确:让程序代码可以直接访问数据库,而无需额外的接口层。

传统的 SQL 是在数据库客户端中执行的,而 E-SQL 则把 SQL 嵌入在源代码中。
这样一来,程序可以直接完成查询、插入、事务控制等操作。


二、E-SQL 的工作原理

嵌入式 SQL 程序的执行过程分为四个主要阶段:

  1. 编写阶段
    在源程序中写入 EXEC SQL 开头的 SQL 语句。

  2. 预编译阶段(Precompile)
    使用数据库厂商提供的预编译器(如 Oracle 的 Pro*C)扫描源文件,将嵌入式 SQL 转换成 API 调用语句。

  3. 编译阶段
    将转换后的源代码交由普通编译器编译生成可执行文件。

  4. 运行阶段
    程序通过数据库驱动执行 SQL 语句,与数据库交互。

流程示意如下:

源程序 (.pc / .ec)
     ↓ 预编译
转换为标准语言代码 (.c / .cpp)
     ↓ 编译
生成可执行程序
     ↓ 运行
访问数据库

这种方式可以理解为:

E-SQL = SQL + 编程语言 + 预编译器支持。


三、一个简单的嵌入式 SQL 实例(以 C 语言为例)

#include <stdio.h>

/* 定义变量区 */
EXEC SQL BEGIN DECLARE SECTION;
    int id;
    char name[20];
EXEC SQL END DECLARE SECTION;

int main() {
    /* 连接数据库 */
    EXEC SQL CONNECT TO 'testdb' USER 'admin' USING 'password';

    /* 执行查询 */
    EXEC SQL SELECT name INTO :name FROM student WHERE id = :id;

    printf("Student name: %s\n", name);

    /* 提交事务并断开连接 */
    EXEC SQL COMMIT WORK;
    EXEC SQL DISCONNECT;
    return 0;
}

这段代码展示了 E-SQL 的核心特性:

  • EXEC SQL 语句由预编译器识别;
  • SQL 与语言逻辑紧密结合;
  • 使用主语言变量(如 :id)与 SQL 参数绑定。

四、不同数据库系统中的 E-SQL 实现

虽然嵌入式 SQL 的思想一致,但不同数据库厂商的实现各有差异。
下表展示了主要系统的特性对比:

数据库系统 预编译器名称 语言支持 特点
Oracle ProC / ProCOBOL C, COBOL 功能最全,支持动态 SQL 和游标操作
IBM DB2 DB2 Precompiler C, COBOL, FORTRAN 与主机兼容性强,工业系统常用
Sybase SQL Server Embedded SQL/C C 轻量级、早期 UNIX 环境常用
Informix ESQL/C C 对事务和游标支持良好,语法简洁
Microsoft SQL Server 7 Embedded C (ODBC) C/C++ 通过 ODBC 层封装 E-SQL 调用

五、E-SQL 与普通 SQL 的区别

对比项 普通 SQL 嵌入式 SQL
执行方式 独立运行在数据库中 嵌入在程序源代码中
调用方式 命令行/脚本 由程序执行
性能 每次运行需重新解析 编译期预解析,执行效率高
可维护性 修改 SQL 简单 修改需重新编译程序
类型检查 运行时发现错误 编译期检查变量与字段匹配

六、E-SQL 的优点与局限

✅ 优点

  1. 执行性能高:预编译后直接生成数据库 API 调用,减少解析时间。
  2. 类型安全:编译时检查 SQL 与变量类型是否匹配。
  3. 结构紧凑:逻辑与数据访问集中在一处,减少接口层。

⚠️ 局限

  1. 维护复杂:SQL 改动后必须重新预编译并编译程序。
  2. 移植性差:不同厂商的 E-SQL 方言不完全一致。
  3. 调试难度大:SQL 错误常与业务逻辑混杂,定位困难。

七、E-SQL 在现代开发中的地位

虽然现在主流框架如 JDBC、MyBatis、Hibernate 已替代了 E-SQL,但在以下领域它依旧活跃:

  • 嵌入式设备系统(如工控机、PLC 控制系统);
  • 银行、电信、航空业的遗留系统维护
  • 高性能 C/C++ 后端服务
  • 对执行效率和稳定性要求极高的批处理任务

其实,现代框架中的 “动态 SQL” 和 “参数绑定” 概念,正是从 E-SQL 的设计思想演化而来。
可以说:理解 E-SQL,就是理解数据库访问的根基。


八、总结

嵌入式 SQL(E-SQL) 是一种经典而严谨的数据库访问方式。
它代表了早期数据库系统与编程语言深度耦合的设计理念。

通过本文,你可以了解到:

  • E-SQL 的定义与实现流程;
  • 不同数据库系统的差异;
  • 优缺点与现代价值。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐