#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include "sqlca.h" //注意:在oracle中,如果使用char定长类型,那么数据库中的数据如果不足20,那么oracle默认以空格填充 //varchar是变长类型,不足20,oracle不会填充空格 //varchar本质上是typedef struct { unsigned short len; unsigned char arr[1]; } varchar;是个结构 //但是在做输入(例如insert into)的时候,char和varchar没有区别 EXEC SQL BEGIN DECLARE SECTION; char *serverid="scott/123456@orcl"; int deptno1[100]; char dname1[100][20]; char loc1[100][20]; int deptno2[100]; varchar dname2[100][20]; varchar loc2[100][20]; int ida1[10]; int idb1[10]; char name1[10][20]; EXEC SQL END DECLARE SECTION; //错误处理升级函数 void sqlerr() { int ret=0; char stn[120]; //sqlfc:SQL语句的实际长度 size_t sqlfc,stmlen=120; EXEC SQL WHENEVER SQLERROR CONTINUE; ret=sqlgls(stn,&stmlen,&sqlfc); if(ret!=0) { printf("sqlgls() failed ! err code: %d\r\n",ret); return ; } printf("出错的SQL语句是:%.*s\r\n",stmlen,stn); printf("err reason:%.*s\r\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc); EXEC SQL ROLLBACK WORK RELEASE; } void main() { EXEC SQL WHENEVER SQLERROR DO sqlerr(); //连接数据库 EXEC SQL connect:serverid ; printf("connect ok!\r\n"); //安装没有找到错误函数,没有找到数据(比如要查询100条数据,但是数据库只有5条),继续执行下一条语句 EXEC SQL WHENEVER NOT FOUND CONTINUE; //执行多条查询-- //into关键字解释:因为要将查询出来的数据放入宿主变量中 EXEC SQL select deptno,dname,loc into :deptno2,:dname2,:loc2 from dept; //sqlca.sqlerrd[2]获取SQL语句查询到的记录数 int count=sqlca.sqlerrd[2]; //终端打印数据 int i=0; for(i=0;i<count;i++) { printf("第%d条:deptno=%d,dname=%s,loc=%s\r\n",i,deptno2[i],dname2[i].arr,loc2[i].arr); } //批量插入 for(i=0;i<10;i++) { ida1[i]=i+1; idb1[i]=i*3; strcpy(name1[i],"hello"); } //for 5:表示只插入5条数据 //bug提示:有时候insert 操作会卡住,这可能是由于表中已经有相同的主键了,约束下无法插入 EXEC SQL for 5 insert into t2 values(:ida1,:idb1,:name1); //提交断开连接 EXEC SQL COMMIT RELEASE; system("pause"); }
原文:http://www.cnblogs.com/zhanggaofeng/p/6280181.html