
# 执行SQL语句
嵌入式SQL-C程序支持直接执行静态SQL语句（如SELECT、INSERT），也支持执行动态SQL语句。动态SQL语句详情请参考[执行动态SQL语句](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0331.html)。本节主要介绍执行静态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：关闭自动提交模式，缺省模式。
 
