我的程序用PRO*C操作数据库。
该错误在程序运行数小时后会出现。代码找不到问题,如果有问题程序根本就运行不了。
官方错误码解释为:
Cause: This internal error typically indicates a memory-related error.Action: Check the program for memory-related errors, such as invalid pointers or array-bounds violations.指针和数组看不出什么错误。
程序代码如下:
int get_register_info(int cno,XT_REGIST_REQ& reg, char* dblinkname)
{
struct sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
unsigned int int_tmp,client_no, tmpno;
int sex,face,rule,age, money;
VARCHAR var_email[61],var_name[21];
VARCHAR var_addr[81],var_mobile[21],var_desc[501];
VARCHAR var_face[201];
VARCHAR var_birthday[9],var_nickname[33];
VARCHAR db_link_name[10];
int province,country,city,jobtype;
EXEC SQL END DECLARE SECTION;
face = 0xfe;
SET_INIT_NULL(var_email);
SET_INIT_NULL(var_name);
SET_INIT_NULL(var_addr);
SET_INIT_NULL(var_mobile);
SET_INIT_NULL(var_desc);
SET_INIT_NULL(var_face);
SET_INIT_NULL(var_birthday);
SET_INIT_NULL(var_nickname);
money = 0;
country = 0;
province = 0;
city = 0;
jobtype = 0;
int_tmp = 0;
tmpno = 0;
strcpy((char*)db_link_name.arr, dblinkname);
db_link_name.len = (short)strlen((char*)db_link_name.arr);
client_no = cno;
int db_ret;
EXEC SQL CONTEXT USE :ctx[atoi(dblinkname+7)];
start:
EXEC SQL AT :db_link_name
SELECT A.USERID,A.USERNAME, A.NICKNAME,
B.EMAIL,B.USERSEX,B.JOINAUTHFLAG,B.MPHONE,B.USERDESC,B.NATION,B.PROVINCE,B.CITY, B.BIRTHDAY,
C.USERPICURI,C.USERIMGFLAG,
D.USRADDRESS,D.USERJOB,
E.USERMONEY
INTO :tmpno,:var_name,:var_nickname,
:var_email,:sex,:rule,:var_mobile,:var_desc, :country,:province,:city,:var_birthday,
:var_face,:face,
:var_addr,:jobtype,
:money
FROM
(SELECT USERID,USERNAME,NICKNAME FROM BLOG_USERINFO WHERE USERID=:client_no) A,
BLOG_USERBLOGINFO B,
BLOG_USERPICINFO C,
BLOG_USERDETAIL D,
BLOG_USERSTAT E
WHERE B.USERID = A.USERID AND C.USERID = A.USERID AND D.USERID = A.USERID AND E.USERID=A.USERID; db_ret = sqlca.sqlcode;
if( (sqlca.sqlcode < 0&&sqlca.sqlcode!=-1405) || sqlca.sqlcode == 1403)
{
errrpt(sqlca);
if( db_ret == -3114 || -1012==db_ret || db_ret == -3113)
{
connect_db(dblinkname);
goto start;
}
char errbuf[255];
sprintf(errbuf, "ID:%d, get_register_info--ERRORCODE:%d",cno, db_ret);
if (db_ret < 0 && db_ret != -1405)
errrpt(sqlca); return db_err(errbuf,IMDB_SELECT_USERINFO, dblinkname);
}
if(var_email.len>=60||var_name.len>=20||var_nickname.len>=32||
var_addr.len>=80||var_mobile.len>=20|| var_desc.len>=500 )
{
return db_err("get_register_info()",IMDB_USERINFO_ERROR,dblinkname);
} reg.country = country;
reg.province = province;
reg.city = city;
reg.jobtype = jobtype;
strcpy(reg.birthday,(char*)var_birthday.arr);
strcpy(reg.address,(char*)var_addr.arr);
strcpy(reg.email,(char*)var_email.arr);
strcpy(reg.name,(char*)var_name.arr);
reg.sex = sex;
reg.face=face;
if(reg.face == 0 ||reg.face >0xff)
reg.face = 0xfe;
else
reg.face--;
reg.rule=rule;
var_mobile.arr[var_mobile.len]='\0';
strcpy(reg.mobile,(char*)var_mobile.arr);
var_desc.arr[var_desc.len]='\0';
strcpy(reg.description,(char*)var_desc.arr);
var_nickname.arr[var_nickname.len]='\0';
strcpy(reg.nickname,(char*)var_nickname.arr);
var_face.arr[var_face.len] = '\0';
strcpy(reg.faceuri, (char*)var_face.arr);
reg.usermoney = money; return db_err("get_register_info()",IMDB_SUCCESS);
}errrpt(sqlca);//打印出错误信息如下允许打开的最大游标个数: 10 打开的最大游标个数: 10 当前打开游标数: 10 重新分配的游标高速缓存数: 2431
解析SQL语句的条数: 2441 执行的SQL语句数: 8115
最近执行的SQL语句: select A.USERID ,A.USERNAME ,A.NICKNAME ,B.EMAIL ,B.USERSEX ,B.JOINAUT
文件:sample.pc 行号:602 错误码:-2101 原因:SQL-02101: 游标高速缓存不一致。单元游标/全局游标不匹配
该错误在程序运行数小时后会出现。代码找不到问题,如果有问题程序根本就运行不了。
官方错误码解释为:
Cause: This internal error typically indicates a memory-related error.Action: Check the program for memory-related errors, such as invalid pointers or array-bounds violations.指针和数组看不出什么错误。
程序代码如下:
int get_register_info(int cno,XT_REGIST_REQ& reg, char* dblinkname)
{
struct sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
unsigned int int_tmp,client_no, tmpno;
int sex,face,rule,age, money;
VARCHAR var_email[61],var_name[21];
VARCHAR var_addr[81],var_mobile[21],var_desc[501];
VARCHAR var_face[201];
VARCHAR var_birthday[9],var_nickname[33];
VARCHAR db_link_name[10];
int province,country,city,jobtype;
EXEC SQL END DECLARE SECTION;
face = 0xfe;
SET_INIT_NULL(var_email);
SET_INIT_NULL(var_name);
SET_INIT_NULL(var_addr);
SET_INIT_NULL(var_mobile);
SET_INIT_NULL(var_desc);
SET_INIT_NULL(var_face);
SET_INIT_NULL(var_birthday);
SET_INIT_NULL(var_nickname);
money = 0;
country = 0;
province = 0;
city = 0;
jobtype = 0;
int_tmp = 0;
tmpno = 0;
strcpy((char*)db_link_name.arr, dblinkname);
db_link_name.len = (short)strlen((char*)db_link_name.arr);
client_no = cno;
int db_ret;
EXEC SQL CONTEXT USE :ctx[atoi(dblinkname+7)];
start:
EXEC SQL AT :db_link_name
SELECT A.USERID,A.USERNAME, A.NICKNAME,
B.EMAIL,B.USERSEX,B.JOINAUTHFLAG,B.MPHONE,B.USERDESC,B.NATION,B.PROVINCE,B.CITY, B.BIRTHDAY,
C.USERPICURI,C.USERIMGFLAG,
D.USRADDRESS,D.USERJOB,
E.USERMONEY
INTO :tmpno,:var_name,:var_nickname,
:var_email,:sex,:rule,:var_mobile,:var_desc, :country,:province,:city,:var_birthday,
:var_face,:face,
:var_addr,:jobtype,
:money
FROM
(SELECT USERID,USERNAME,NICKNAME FROM BLOG_USERINFO WHERE USERID=:client_no) A,
BLOG_USERBLOGINFO B,
BLOG_USERPICINFO C,
BLOG_USERDETAIL D,
BLOG_USERSTAT E
WHERE B.USERID = A.USERID AND C.USERID = A.USERID AND D.USERID = A.USERID AND E.USERID=A.USERID; db_ret = sqlca.sqlcode;
if( (sqlca.sqlcode < 0&&sqlca.sqlcode!=-1405) || sqlca.sqlcode == 1403)
{
errrpt(sqlca);
if( db_ret == -3114 || -1012==db_ret || db_ret == -3113)
{
connect_db(dblinkname);
goto start;
}
char errbuf[255];
sprintf(errbuf, "ID:%d, get_register_info--ERRORCODE:%d",cno, db_ret);
if (db_ret < 0 && db_ret != -1405)
errrpt(sqlca); return db_err(errbuf,IMDB_SELECT_USERINFO, dblinkname);
}
if(var_email.len>=60||var_name.len>=20||var_nickname.len>=32||
var_addr.len>=80||var_mobile.len>=20|| var_desc.len>=500 )
{
return db_err("get_register_info()",IMDB_USERINFO_ERROR,dblinkname);
} reg.country = country;
reg.province = province;
reg.city = city;
reg.jobtype = jobtype;
strcpy(reg.birthday,(char*)var_birthday.arr);
strcpy(reg.address,(char*)var_addr.arr);
strcpy(reg.email,(char*)var_email.arr);
strcpy(reg.name,(char*)var_name.arr);
reg.sex = sex;
reg.face=face;
if(reg.face == 0 ||reg.face >0xff)
reg.face = 0xfe;
else
reg.face--;
reg.rule=rule;
var_mobile.arr[var_mobile.len]='\0';
strcpy(reg.mobile,(char*)var_mobile.arr);
var_desc.arr[var_desc.len]='\0';
strcpy(reg.description,(char*)var_desc.arr);
var_nickname.arr[var_nickname.len]='\0';
strcpy(reg.nickname,(char*)var_nickname.arr);
var_face.arr[var_face.len] = '\0';
strcpy(reg.faceuri, (char*)var_face.arr);
reg.usermoney = money; return db_err("get_register_info()",IMDB_SUCCESS);
}errrpt(sqlca);//打印出错误信息如下允许打开的最大游标个数: 10 打开的最大游标个数: 10 当前打开游标数: 10 重新分配的游标高速缓存数: 2431
解析SQL语句的条数: 2441 执行的SQL语句数: 8115
最近执行的SQL语句: select A.USERID ,A.USERNAME ,A.NICKNAME ,B.EMAIL ,B.USERSEX ,B.JOINAUT
文件:sample.pc 行号:602 错误码:-2101 原因:SQL-02101: 游标高速缓存不一致。单元游标/全局游标不匹配
“EXEC SQL AT :db_link_name COMMIT RELEASE;”后再重新连接
goto 没有问题。
connect_db(dblinkname) 是在数据库连接被断开或超时以后又重连。
Oracle好像默认20分钟没有任何操作连接将被断开。
难道引起问题不在这个函数内?只是这个函数使用率较高,而且最先出现这个错误。
EXEC SQL OPEN 重复