在嵌入式SQL编程中,当查询返回多条记录时,通常需要使用游标(cursor)来逐条检索和处理这些记录。游标提供了一种从结果集中逐行访问数据的方法。
以下是一个使用游标在嵌入式SQL中检索多条记录的示例:
#include <stdio.h>
#include <sqlca.h> // 假设sqlca.h包含了嵌入式SQL所需的所有定义
EXEC SQL BEGIN DECLARE SECTION;
int emp_id;
char emp_name[51];
float salary;
EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT emp_id, emp_name, salary FROM employees;
EXEC SQL END DECLARE SECTION;
int main() {
EXEC SQL CONNECT TO your_database_name USER your_username USING your_password;
if (sqlca.sqlcode != 0) {
printf("Error connecting to database: %s\n", sqlca.sqlerrm.sqlerrmc);
return 1;
}
// 打开游标
EXEC SQL OPEN emp_cursor;
// 逐条检索记录
while (1) {
EXEC SQL FETCH emp_cursor INTO :emp_id, :emp_name, :salary;
// 检查是否还有更多记录
if (sqlca.sqlcode == SQL_NOTFOUND) {
break; // 没有更多记录,退出循环
} else if (sqlca.sqlcode != 0) {
printf("Error fetching data: %s\n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL CLOSE emp_cursor; // 关闭游标
EXEC SQL DISCONNECT ALL;
return 1;
}
// 打印查询结果
printf("Employee ID: %d\n", emp_id);
printf("Employee Name: %s\n", emp_name);
printf("Salary: %.2f\n", salary);
printf("\n");
}
// 关闭游标
EXEC SQL CLOSE emp_cursor;
// 断开数据库连接
EXEC SQL DISCONNECT ALL;
return 0;
}
注意:
-
SQL_NOTFOUND
是一个假设的宏,用于表示没有更多的记录可供检索。在实际环境中,你需要根据嵌入式SQL库或数据库系统提供的实际宏或错误码来判断是否还有更多记录。 -
在上面的示例中,我们假设
sqlca.sqlcode
用于检查SQL语句的执行状态。这同样取决于你使用的嵌入式SQL库或数据库系统。 -
EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT ...
语句声明了一个游标emp_cursor
,它对应于SELECT
查询的结果集。 -
EXEC SQL OPEN emp_cursor;
打开游标以供检索数据。 -
EXEC SQL FETCH emp_cursor INTO ...;
逐条从游标中检索记录,并将它们放入C变量中。 -
在循环中,我们使用
sqlca.sqlcode
来检查是否还有更多的记录可供检索。如果没有更多的记录(即游标已到达结果集的末尾),则退出循环。 -
最后,我们使用
EXEC SQL CLOSE emp_cursor;
关闭游标,并使用EXEC SQL DISCONNECT ALL;
断开与数据库的连接。
请确保根据你的具体数据库和嵌入式SQL实现来调整代码。不同的系统和库可能有不同的语法和错误处理机制。