预编译语句执行
在C语言的嵌入式SQL应用程序开发中,创建可多次执行的SQL语句有时是必要的。这样做可以通过避免每次执行时重新编译语句来节省处理器时间。
在SmartESQL环境中,此过程通过调用mcosql_prepare_statement()
函数预先编译SQL语句实现;随后,可通过调用mcosql_execute_prepared_statement()
执行预编译的命令,或使用mcosql_execute_prepared_query()
执行查询并获取结果集。这种方法不仅省去了重复编译的过程,还允许参数绑定仅需进行一次。然而,需要注意的是,由于采用指针参数的方式,应用程序必须确保传递给mcosql_prepare_statement()
的参数变量在整个预编译语句的生命周期内保持有效(即处于作用域内),并且在预编译语句执行时这些参数应具有实际值。
注
Python、JNI 和 .NET Framework 的包装器 API 没有预编译语句的支持。这是由于 Python、Java 和 C# 语言中不存在指针。因此,无法间接存储和使用变量。
准备
以下代码片段定义并编译了 5 个预编译语句:
int2 delta;
unt1 aid;
unt4 tid;
int8 bid;
char historyFiller[10] = “----------“;
database_t * engine;
transaction_t * trans;
prepared_statement stmt[5];
...
mcosql_prepare_statement(engine, trans, stmt[0],
"UPDATE accounts SET Abalance=Abalance+%*i2 WHERE Aid=%*u1",
&delta, &aid);
mcosql_prepare_statement(engine, trans, stmt[1],
"SELECT Abalance FROM accounts WHERE Aid=%*u1", &aid);
mcosql_prepare_statement(engine, trans, stmt[2],
"UPDATE tellers SET Tbalance=Tbalance+%*i2 WHERE Tid=%*u4",
&delta, &tid);
mcosql_prepare_statement(engine, trans, stmt[3],
"UPDATE branches SET Bbalance=Bbalance+%*i2 WHERE Bid=%*i8",
&delta, &bid);
mcosql_prepare_statement(engine, trans, stmt[4],
"INSERT INTO account_history(Tid, Bid, Aid, delta, htime, filler) VALUES”
“ (%*u4,%*i8,%*u1,%*i2,now,%s)", &tid, &bid, &aid, &delta, historyFiller);
请注意使用“%*iN”
和“%*uN”
占位符来表示有符号和无符号整数变量,其中“N”
表示整数的宽度。
SQL 的插入、更新和删除语句的执行方式如下:
mcosql_execute_prepared_statement(engine, stmt[0]);
并且使用 mcosql_execute_prepared_query()
函数执行查询以返回一个 data_source_t 结构体。
status_t mcosql_execute_prepared_query(
database_t database,
transaction_t trans,
prepared_statement_t stmt,
data_source_t* data_source
);
也可以在一个线程中准备一条语句,然后在另一个线程中执行该语句。