执行SQL语句
嵌入式SQL-C程序支持直接执行静态SQL语句(如SELECT、INSERT),也支持执行动态SQL语句。动态SQL语句详情请参考执行动态SQL语句。本节主要介绍执行静态SQL语句。
静态SQL语句执行步骤如下:
- 创建表结构:
EXEC SQL CREATE TABLE foo (a int, b varchar);
- 插入单行记录:
EXEC SQL INSERT INTO foo VALUES (5, 'abc');
- 删除指定记录:
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';
通过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:关闭自动提交模式,缺省模式。