更新时间:2026-10-21 GMT+08:00
分享

概述

在嵌入式SQL-C程序中,静态SQL在编译期即确定完整的指令结构,可由ecpg预编译器直接进行语法与类型检查。而动态SQL(Dynamic SQL)是指在编译期无法确定,需在程序运行期间根据用户输入、配置文件或业务逻辑动态构建的SQL语句。动态SQL在C代码中以字符串宿主变量(如char[]或VARCHAR)的形式存在,并在运行期传递给ecpg引擎与GaussDB实时解析并执行。

动态SQL的核心优势在于极高的灵活性,能够轻松应对组合条件查询、通用报表生成以及动态分表(如运维工具动态组装查询条件)等复杂工程场景。但其代价是增加了开发复杂度与运行时开销:GaussDB必须在运行期实时解析语法、校验权限并生成执行计划,执行效率略低于静态SQL;同时,预编译器无法提前检查动态SQL文本的正确性,且不当的字符串拼接极易引发SQL注入(SQL Injection)安全风险。

在开发实践中,应遵循“首选静态SQL”的原则。只有当以下要素在编译期无法预知时,才推荐使用动态SQL:

  • SQL语句文本未确定:需要运行期动态拼装命令或WHERE过滤条件。
  • 数据库对象未确定:需要在运行期动态指定目标表名、列名或视图。
  • 参数信息未确定:绑定参数的数量或数据类型在编译期无法确定。

根据动态SQL是否包含绑定参数以及是否返回数据集,ecpg将动态SQL的处理归纳为三种递进的模式,本章后续将依次展开。

相关文档