数据库 proc编程四
错误处理机制
当在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");
}
数据库 proc编程四的更多相关文章
- 数据库 Proc编程二
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- 数据库 proc编程六
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- 数据库 proc编程五
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- 数据库 proc编程九
第一种动态sql EXEC SQL EXECUTE IMMEDIATE :psql; .仅适用于非select语句 .嵌入SQL语句中不能包含输入宿主变量 void main() { EXEC SQL ...
- 数据库 proc编程八
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- 数据库 proc编程七
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- 数据库 proc编程三
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- Oracle Proc编程性能优化经验
Proc 是Oracle提供的一种数据库操作的API.它是基于ESql技术的,需要预编译后才可以变成普通c代码,非常不直观,使用起来不太方便,阅读也存在困难. 因为这些问题导致程序员平时开发中会出现一 ...
- 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。
一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...
随机推荐
- ASP服务器I I S出现authentication mode=Windows错误解决办法
网上下载的asp.net源码出现 <authentication mode="Windows"/>错误信息 属性 说明 mode 必选的属性. 指定应用程序的默认身份验 ...
- ASP.NET找不到类型或命名空间名称怎么办
如图所示,运行之后提示找不到类型或空间名称,右击有波浪线的代码,选择解析,using XXX 随后自动补上了程序集引用
- 记一发Hive on tez的配置(Hive 3.1.1, Hadoop 3.0.3, Tez 0.9.1)
直接下载Tez的binary包部署安装是有问题的,因为默认支持hadoop版本为2.7,2.7以上的就需要手动编译了. 下载Tez源码 CD到源码文件夹,mvn install -Dhadoop.ve ...
- Android WiFi热点7.1以上版本适配
代码地址如下:http://www.demodashi.com/demo/13907.html 一.准备工作 开发环境: jdk1.8 AS(3.0.1) 运行环境: 华为V10(Android ...
- 为什么我没有拔出钥匙 ——开锁引发的程序bug解决方案的思考
http://blog.csdn.net/wojiushiwo987/article/details/8851204为什么我没有拔出钥匙 ——开 ...
- iOS 获得通讯录中联系人的所有属性--b
ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfA ...
- tsung的配置使用
1.在root下新建.tsung文件,在.tsung文件新建log文件夹..tsung文件用于存放log和xml文件 2.复制/usr/local/tsung/share/doc/tsung/exam ...
- 摘:C++:用ADO操作数据库的方法步骤
ADO接口简介 ADO库包含三个基本接口:_ConnectionPtr接口._CommandPtr接口和_RecordsetPtr接口. _ConnectionPtr接口返回一个记录集或一个空指针 ...
- string 类简介和例程
一.标准库string类型 string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作 ,在VC中直接F1查看 template < class C ...
- WIN10 无法访问2003 server共享
With Windows 10 v1803 or Spring Creators update released I have decided to do a fresh installation o ...