/*
*功能:proc的动态游标操作
*源文件:dyn_cursor.pc
*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
/*#define SQLCA_NONE*/
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
char db_name[25] = "dbname";
EXEC SQL END DECLARE SECTION;
void errorHandle(char *sm)
{
char buf[1024];
long bufLen,msgLen,fc;
sprintf(buf, "执行数据库操作(%s)失败, ORA ERROR:%.70s, SQLCA.SQLCODE=%d", sm, sqlca.sqlerrm.sqlerrmc, sqlca.sqlcode);
printf("%s/n", buf);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL AT :db_name ROLLBACK WORK;
return;
}
void connect()
{
EXEC SQL BEGIN DECLARE SECTION;
char connString[25] = "nmc/nmc@atest_229";
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR DO errorHandle("Connect Database");
EXEC SQL AT :db_name CONNECT :connString;
}
void disconnect()
{
EXEC SQL WHENEVER SQLERROR DO errorHandle("Disconnect Database");
EXEC SQL AT :db_name COMMIT WORK RELEASE;
}
int main()
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR sql_string[1024];
int id;
EXEC SQL END DECLARE SECTION;
char tabName[32];
printf("Input the table name: ");
gets(tabName);
connect();
//动态构造SQL语句
sql_string.len = sprintf((char *)sql_string.arr,"select sys_int_id from %s", tabName);
EXEC SQL AT :db_name PREPARE S_MAIN_DEV from :sql_string;
//声明游标
EXEC SQL AT :db_name DECLARE C_MAIN_DEV CURSOR FOR S_MAIN_DEV;
//打开游标
EXEC SQL AT :db_name OPEN C_MAIN_DEV;
EXEC SQL WHENEVER NOTFOUND DO break;
while (1)
{
//从游标取数据
EXEC SQL AT :db_name FETCH C_MAIN_DEV into :id;
printf("Field:%d:/n",id);
}
//关闭游标
EXEC SQL AT :db_name CLOSE C_MAIN_DEV;
disconnect();
return 0;
}