嵌入式SQL

C语言:EXEC 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; // 执行

动态参数

用**?**代替参数。

  1. 声明SQL语句主变量
  2. 准备SQL语句(PREPARE)EXEC SQL PREPARE <语句名> FROM ;
  3. 执行准备好的语句(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;

你可能感兴趣的:(sql,数据库,java)