更新时间:2026-07-28 GMT+08:00
分享

执行SQL语句

嵌入式SQL-C程序支持直接执行静态SQL语句(如SELECT、INSERT),也支持执行动态SQL语句。动态SQL语句详情请参考执行动态SQL语句。本节主要介绍执行静态SQL语句。

静态SQL语句执行步骤如下:

  1. 创建表结构:

    EXEC SQL CREATE TABLE foo (a int, b varchar);

  2. 插入单行记录:

    EXEC SQL INSERT INTO foo VALUES (5, 'abc');

  3. 删除指定记录:

    EXEC SQL DELETE FROM foo WHERE a = 5;

  4. 更新表数据:

    EXEC SQL UPDATE foo SET b = 'gdp' WHERE a = 7;

  5. 单行查询数据:

    EXEC SQL SELECT a INTO :var_a FROM foo WHERE b = 'def';

    通过INTO关键字将查询结果直接映射到绑定的宿主变量中。

完整使用示例如下:

前提条件:需要提前创建testdb数据库。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main ()
{
    ECPGdebug (1, stderr);

    EXEC SQL BEGIN DECLARE SECTION;
    int var_a;
    EXEC SQL END DECLARE SECTION;

    /* 提前创建testdb */
    EXEC SQL CONNECT TO testdb;

    /* 创建一个表 */
    EXEC SQL CREATE TABLE foo (a int, b varchar);

    /* 插入数据 */
    EXEC SQL INSERT INTO foo VALUES (5, 'abc');
    EXEC SQL INSERT INTO foo VALUES (6, 'def');
    EXEC SQL INSERT INTO foo VALUES (7, 'ghi');

    /* 删除一行 */
    EXEC SQL DELETE FROM foo WHERE a = 5;

    /* 更新表数据 */
    EXEC SQL UPDATE foo SET b = 'gdp' WHERE a = 7;

    /* 单行查询表数据 */
    EXEC SQL SELECT a INTO :var_a FROM foo WHERE b = 'def';

    /* 打印查询结果 */
    printf("select res is %d\n", var_a);
    EXEC SQL DISCONNECT;
    return 0;
}

运行结果如下([39841]是线程ID,随机生成):

[39841]: ECPGdebug: set to 1
[39841]: ECPGconnect: opening database testdb on <DEFAULT> port <DEFAULT>
[39841]: ecpg_execute on line 17: query: create table foo ( a int , b varchar ); with 0 parameter(s) on connection testdb
[39841]: ecpg_execute on line 17: using PQexec
[39841]: ecpg_execute on line 17: OK: CREATE TABLE
[39841]: ecpg_execute on line 20: query: insert into foo values ( 5 , 'abc' ); with 0 parameter(s) on connection testdb
[39841]: ecpg_execute on line 20: using PQexec
[39841]: ecpg_execute on line 20: OK: INSERT 0 1
[39841]: ecpg_execute on line 21: query: insert into foo values ( 6 , 'def' ); with 0 parameter(s) on connection testdb
[39841]: ecpg_execute on line 21: using PQexec
[39841]: ecpg_execute on line 21: OK: INSERT 0 1
[39841]: ecpg_execute on line 22: query: insert into foo values ( 7 , 'ghi' ); with 0 parameter(s) on connection testdb
[39841]: ecpg_execute on line 22: using PQexec
[39841]: ecpg_execute on line 22: OK: INSERT 0 1
[39841]: ecpg_execute on line 25: query: delete from foo where a = 5; with 0 parameter(s) on connection testdb
[39841]: ecpg_execute on line 25: using PQexec
[39841]: ecpg_execute on line 25: OK: DELETE 1
[39841]: ecpg_execute on line 28: query: update foo set b = 'gdp' where a = 7; with 0 parameter(s) on connection testdb
[39841]: ecpg_execute on line 28: using PQexec
[39841]: ecpg_execute on line 28: OK: UPDATE 1
[39841]: ecpg_execute on line 31: query: select a from foo where b = 'def'; with 0 parameter(s) on connection testdb
[39841]: ecpg_execute on line 31: using PQexec
[39841]: ecpg_execute on line 31: correctly got 1 tuples with 1 fields
[39841]: ecpg_get_data on line 31: RESULT: 6 offset: 4; array: no
select res is 6
[39841]: ecpg_finish: connection testdb closed

事务管理

在执行SQL语句的过程中,通常包括事务管理。事务(Transaction)是数据库操作的基本单位,用于确保一组SQL语句要么全部成功执行,要么全部失败回滚。事务的四大特性(ACID)包括:

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。
  • 一致性(Consistency):事务执行前后,数据库状态保持一致。
  • 隔离性(Isolation):多个事务并发执行时,彼此互不干扰。
  • 持久性(Durability):事务提交后,对数据库的修改是永久性的。

在ecpg缺省模式下,语句只有在EXEC SQL COMMIT发出的时候才被提交。嵌入的SQL接口支持事务的自动提交(通过EXEC SQL SET AUTOCOMMIT TO ON语句设置自动提交)。在自动提交模式下,每条命令都是自动提交的,除非它们被包围在一个明确的事务块里。自动提交模式可以用EXEC SQL SET AUTOCOMMIT TO OFF语句关闭。

常见事务管理命令如下:
  • EXEC SQL COMMIT:提交正在进行的事务。
  • EXEC SQL ROLLBACK:回滚正在进行的事务。
  • EXEC SQL SET AUTOCOMMIT TO ON:启动自动提交模式。
  • EXEC SQL SET AUTOCOMMIT TO OFF:关闭自动提交模式,缺省模式。

相关文档