void DB::insert()
{
printf("/nnow~ insert start!/n");
scanf("%s%s%s",in1,in2,in3);
EXEC SQL insert into obj_tab(cat_id,obj_id,obj_desc)
VALUES(:in1,:in2,:in3);
EXEC SQL WHENEVER SQLERROR DO sqlerror();
EXEC SQL COMMIT WORK;
}
void sqlerror()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("/nORACLE error detected:");
printf("/n% .70s /n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
}
//SQLERROR就是sqlca.sqlcode<0
异常处理特别针对INSERT UPDATE DELETE 才显的最重要,就是在执行这些语句的时候,若是出错了,可以进行回滚。。。
例如:
EXEC SQL WHENEVER SQLERROR GOTO errprint;
.....
errprint:
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("/n/n>>>>> Error during execution:/n");
printf("%s/n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
或者:先定义一个函数
sqlerror()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("/nORACLE error detected:");
printf("/n% .70s /n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
}
main(){
...
EXEC SQL WHENEVER SQLERROR DO sqlerror();
...
}