错误处理机制
当在Pro*C/C++应用程序中运行SQL语句中,Oracle会将最近执行的SQL语句的状态信息存储到状态变量SQLCODE、SQLSTATE或者SQLCA结构中。
当SQL语句执行成功时,一般情况下不需要进行任何其他处理;当SQL语句执行失败时,应用程序应该能够检测到失败信息,并进行适当的处理,
以加强应用程序的健壮性。在编写Pro*C/C++应用程序时,通过使用WHENEVER语句可以检测并处理SQL错误,语法如下:
EXEC SQL WHENEVER <condition> <action>
其中condition用于指定要检测的条件,action用户指定满足特定条件时要执行的操作。
.条件
--SQLWARNING:用于检测oracle警告。当检测到该条件时,sqlca.sqlwarn[]会被设置为W。注意:当使用该条件时,必须定义SQLCA结构。
--SQLERROR:用于检测oracle错误。当检测到该条件时,sqlca.sqlcode或者SQLCODE会被设置为负值。
--NOT FOUND:用户检测SELECT或者FETCH操作未检索到行的情况。当MODE=ORACLE时,如果不能找到满足条件的行,
则sqlca.sqlcode会被设置为+;当MODE=ANSI时,SQLCODE会被设置为+100,默认选项是MODE=ORACLE,可以在proc命令行参数中修改配置。
.操作
--CONTINUE:继续执行下一条语句
--DO:执行错误处理函数
--GOTO label_name:转移到标号处执行。
--STOP:回退事务,停止运行。
错误处理方法一
if(sqlca.sqlcode!=)
{
ret=sqlca.sqlcode;
printf("delete err :%d",ret);
return;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h"
//EXEC SQL INCLUDE sqlca;可以用来代替#include "sqlca.h"
EXEC SQL BEGIN DECLARE SECTION;
char *serverid="scott/12356@orcl";
int deptid;
char edname[];
char edloc[];
EXEC SQL END DECLARE SECTION; void main()
{
int ret=;
EXEC SQL connect:serverid ;
if(sqlca.sqlcode!=)
{
ret=sqlca.sqlcode;
printf("connect err :%d",ret);
system("pause");
}else{
printf("connect ok !\r\n");
system("pause");
}
}
错误处理方法二
EXEC SQL WHENEVER SQLERROR DO sqlerr();
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h" EXEC SQL BEGIN DECLARE SECTION;
char *serverid="scott/123456@orcl";
int deptid;
char edname[];
char edloc[];
EXEC SQL END DECLARE SECTION; //错误处理函数
void sqlerr()
{
int ret=;
ret=sqlca.sqlcode;
printf("check err :%d",ret);
} void main()
{
int ret=;
//注意:安装错误处理函数,必须在执行SQL嵌入之前安装
EXEC SQL WHENEVER SQLERROR DO sqlerr();
EXEC SQL connect:serverid ;
printf("connect ok!\r\n");
system("pause");
}
错误处理方法三
EXEC SQL WHENEVER SQLERROR CONTINUE;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h" EXEC SQL BEGIN DECLARE SECTION;
char *serverid="scott/12345@orcl";
int deptid;
char edname[];
char edloc[];
EXEC SQL END DECLARE SECTION; //错误处理升级函数
void sqlerr()
{
//CONTINUE的目的是假设EXEC SQL ROLLBACK WORK RELEASE执行失败,会再次执行sqlerr()函数,造成死循环
//所以设置CONTINUE
EXEC SQL WHENEVER SQLERROR CONTINUE;//下一步
//%.*s解释:sqlca.sqlerrm.sqlerrml是错误信息的长度,sqlca.sqlerrm.sqlerrmc是错误信息,长度为70个字节
//%70s 表示按70个字符显示字符串,但是没有%d %s这种语法,所以c语言是这个%.*s语法,".*"相当于一个占位符
printf("err reason:%.*s\r\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;//回滚事务,关闭SQL连接
} void main()
{
//注意:安装错误处理函数,必须在执行SQL嵌入之前安装
EXEC SQL WHENEVER SQLERROR DO sqlerr();
EXEC SQL connect:serverid ;
printf("connect ok!\r\n");
system("pause");
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h" EXEC SQL BEGIN DECLARE SECTION;
char *serverid="scott/1234456@orcl";
int deptid;
char edname[];
char edloc[];
EXEC SQL END DECLARE SECTION; //错误处理升级函数
void sqlerr()
{
int ret=;
char stn[];
//sqlfc:SQL语句的实际长度
size_t sqlfc,stmlen=;
EXEC SQL WHENEVER SQLERROR CONTINUE;
ret=sqlgls(stn,&stmlen,&sqlfc);
if(ret!=)
{
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");
system("pause");
}

最新文章

  1. web api Route属性定义
  2. win环境安装python爬虫框架scrapy
  3. nios II--实验7——数码管IP硬件部分
  4. jQuery键盘控制方法,以及键值(keycode)对照表
  5. POJ C++程序设计 编程作业—类和对象 编程题#1
  6. 还原没有日志文件的SQL数据库
  7. 【译】UI设计基础(UI Design Basics)--为iOS设计(Design for iOS)(二)
  8. 由命名空间函数而引发思考--js中的对象赋值问题
  9. 【逻辑漏洞】基于BurpSuite的越权测试实战教程
  10. ionic build android 中的报错详细原因以及解决方法
  11. [LeetCode] Stickers to Spell Word 贴片拼单词
  12. kettle 在javascrip代码组件中使用fireToDB()函数实现自定义数据库查询
  13. 在Ubuntu1404的64bit版本下安装caffe
  14. Mybatis关系映射
  15. bzoj 4445 小凸想跑步 - 半平面交
  16. cxGrid控件过滤排序和TClientDataSet同步
  17. Java基础——String类(一)
  18. ios中要在tableview中添加事件的方法
  19. MySQL查看当前运行的事务和执行的账户
  20. maven scope属性值设置含义

热门文章

  1. 解决Linux平台下VMware出现&quot;No 3d support is available from the host&quot;或&quot;Hardware graphics acceleration is not available&quot; 错误
  2. spring相关记录
  3. Appium完整安装教程
  4. 【Redis】redis+php处理高并发,很好的教程||附上 php的文件锁
  5. MySQL —— 如何快速对比数据?
  6. Linux命令-目录处理命令:cp
  7. RESTful Web Service实战 小结1
  8. Javascript Event事件-总结
  9. Atitit。D&amp;D drag&amp;drop拖拽功能c#.net java swing的对比与实现总结
  10. PCIe调试心得_DMA part1