#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sqlca.h"
typedef char dnameType[20];
typedef char locType[20];
//先定义宿主变量
EXEC SQL BEGIN DECLARE SECTION ;
char * serverid = "c##scott/root";
int deptno2;
varchar dname2[20];
varchar loc2[20];
short locind2;
EXEC SQL TYPE dnameType is string(20);
EXEC SQL TYPE locType is string(20);
int deptno3;
dnameType dname3;
locType loc3;
short locind3;
EXEC SQL END DECLARE SECTION ;
void sqlerr();
void sqlerr02();
//游标查询数据库
//1.定义游标
//2.打开游标
//3.提取数据
//4.关闭游标
int main_varchar()
{
int ret = 0;
EXEC SQL WHENEVER SQLERROR DO sqlerr();
//连接数据库
EXEC SQL connect :serverid;
//1
EXEC SQL DECLARE dept_cursor CURSOR FOR select deptno,dname ,loc from dept ;
//2
EXEC SQL OPEN dept_cursor;
//3
int rows_to_fetch;
EXEC SQL WHENEVER NOT FOUND DO break;
while (1)
{
EXEC SQL FETCH dept_cursor INTO:deptno2,:dname2,:loc2:locind2;
if (locind2==-1)
{
strcpy(loc2.arr,"NULL");
}
if(sqlca.sqlcode==100||sqlca.sqlcode==1403)
{
printf("err reason11::%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc); //两个 %70s
//break;
}
//printf("rows_to_fetch: %d \t sqlca.sqlerrd[2]: %d\n",rows_to_fetch,sqlca.sqlerrd[2]);
printf("%d \t %s \t %s \n",deptno2,dname2.arr,loc2.arr);
memset(dname2.arr,0,20);
memset(loc2.arr,0,20);
}
//4
EXEC SQL CLOSE dept_cursor;
EXEC SQL COMMIT RELEASE; //提交事务断开连接
return ret;
}
int main()
{
int ret = 0,icount=0;
//做一个错误处理函数
EXEC SQL WHENEVER SQLERROR DO sqlerr();
//连接数据库
EXEC SQL connect :serverid;
//1
EXEC SQL DECLARE dept_cur CURSOR FOR select deptno,dname,loc from dept;
//2
EXEC SQL OPEN dept_cur;
//3
EXEC SQL WHENEVER NOT FOUND DO break;
printf("--------------------------------------------------------------\n");
while (1)
{
EXEC SQL FETCH dept_cur INTO:deptno3,:dname3,:loc3:locind3;
if (locind3==-1)
{
strcpy(loc3,"NULL");
}
if(sqlca.sqlcode==100||sqlca.sqlcode==1403)
{
printf("err reason11::%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc); //两个 %70s
//break;
}
printf("%d \t %s \t %s \n",deptno3,dname3,loc3);
//memset(dname3,0,20);
//memset(loc3,0,20);
}
//4
EXEC SQL CLOSE dept_cur;
EXEC SQL COMMIT RELEASE; //提交事务断开连接
return ret;
}
void sqlerr02()
{
char stm[120];
size_t outputlen, inputlen=sizeof(stm);
unsigned int ret = 0;
printf("func sqlerr02() begin\n");
//出错时,可以把错误SQL语言给打印出来
EXEC SQL WHENEVER SQLERROR CONTINUE;
ret = sqlgls(stm, &inputlen, &outputlen);
/*
if (ret != 0)
{
printf("func sqlgls() err, %d \n", ret);
return ;
}*/
printf("中国\n");
printf("出错的SQL:%.*s\n", outputlen, stm);
printf("出错原因:%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
//printf("出错原因:%.70s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
printf("func sqlerr02() end\n");
exit(1);
}
void sqlerr()
{
EXEC SQL WHENEVER SQLERROR CONTINUE; // 下一步
printf("err reason sqlerr:%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc); //两个 %70s
EXEC SQL ROLLBACK WORK RELEASE;//
exit(1);
}
Oracle pro*c/c++ cursor demo
最新推荐文章于 2022-06-04 09:55:41 发布