C语言:EXEC SQL <SQL语句>
- SQLCA:SQL通信区,向主语言返回执行状态信息
- 主变量:向SQL提供参数
- 游标:数据缓冲区,存放执行结果。通过cursor逐一获取结果赋给主变量,返回主语言
将SQL查询结果返回给主语言,通过cursor和主变量
EXEC SQL BEGIN DECLARE SECTION;
... // 主变量定义
EXEC SQL END DECLARE SECTION;
long SQLCODE;
EXEC SQL INCLUDE SQLCODE; // 定义SQL通信区
int main()
{
...
EXEC SQL CONNECT TO target[connection name][user name] // 连接
...
EXEC SQL DECLARE SX CURSOR FOR // 定义游标及操作
SELECT * FROM Stu
WHERE SDept := deptname; // SQL等号带冒号
EXEC SQL OPEN SX; // 打开游标,指向第一行数据
for(;;){
EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex, :HSage; // 数据放入主变量
// 数据库更新
EXEC SQL UPDATE Student
SET Sage := 16
WHERE CURRNET OF SX; // WHERE CURRNET OF 游标, 表示游标指向的那行数据
}
EXEC SQL CLOSE SX; // 关闭游标
EXEC SQL COMMIT WORK; // 提交
EXEC SQL DISCONNECT target; // 断开连接
}
动态SQL
动态SQL用主变量存储SQL语句,而不是静态SQL一样存储数据。
//创建基本表
EXEC SQL BEGIN DECLARE SECTION;
const char* smt = "CREATE TABLE TEST(a int);";
EXEC SQL END DECLARE SECTION;
EXEC SQL EXECUTE IMMEDIATE :smt; // 执行
动态参数
用**?**代替参数。
- 声明SQL语句主变量
- 准备SQL语句(PREPARE)
EXEC SQL PREPARE <语句名> FROM <SQL语句主变量>;
- 执行准备好的语句(EXECUTE):
EXEC SQL EXECUTE <语句名> [ INTO <主变量表>] [ USING <主变量>]
// 向TEST表中插入元组
/*声明主变量*/
EXEC SQL BEGIN DECLARE SECTION;
const char *smt = "INSERT INTO TEST VALUES(?);"; // 用?代替动态参数
EXEC SQL END DECLARE SECTION;
/*准备语句*/
EXEC SQL PREPARE mysmt FROM :smt;
/*执行语句*/
EXEC SQL EXECUTE mysmt USING 200;