#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include "sqlca.h" //指示变量:用来对宿主变量做说明 //指示变量作输入:表示宿主变量是空值 //指示变量做输出:当值-1,表示返回的变量是空值 //语法格式:宿主变量 [indicator] 指示变量 其中indicator关键字可加可不加 //eg::name1 indicator :name_ind EXEC SQL BEGIN DECLARE SECTION; char *serverid="scott/123456@orcl"; int ida1[10]; int idb1[10]; varchar name1[10][20]; short name_ind[10];//定义指示变量,必须是short宿主类型 int ida2; int idb2; varchar name2[20]; short name2_ind;//定义指示变量,做输入 EXEC SQL END DECLARE SECTION; int sqlgls(void *,void *,void *); //错误处理升级函数 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 ",ret); return ; } printf("出错的SQL语句是:%.*s ",stmlen,stn); printf("err reason:%.*s ",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! "); //指示变量做输入,插入空值数据 ida2=34; idb2=12; //注意:就算设置了指示变量的值不是-1,宿主变量也会变成空值存入数据库 name2_ind=10; exec sql insert into t2 values(:ida2,:idb2,:name2:name2_ind); //提交事务 EXEC SQL COMMIT; getchar(); EXEC SQL WHENEVER NOT FOUND CONTINUE; //指示变量做输出 EXEC SQL select ida,idb,name into :ida1,:idb1,:name1:name_ind from t2; //sqlca.sqlerrd[2]获取SQL语句查询到的记录数 int count=sqlca.sqlerrd[2]; //终端打印数据 int i=0; for(i=0;i<count;i++) { if(name_ind[i]==-1) { printf("第%d条:ida1=%d,idb1=%d,name1=%s ",i,ida1[i],idb1[i],"空值"); }else { printf("第%d条:ida1=%d,idb1=%d,name1=%s ",i,ida1[i],idb1[i],name1[i].arr); } } //提交断开连接 EXEC SQL COMMIT RELEASE; system("pause"); }