我的程序用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: 游标高速缓存不一致。单元游标/全局游标不匹配

解决方案 »

  1.   

    我觉得问题在用goto上,不知道connect_db(dblinkname);里面是否先有这样的语句
    “EXEC SQL AT :db_link_name COMMIT RELEASE;”后再重新连接
      

  2.   

    谢谢回复。
    goto 没有问题。
    connect_db(dblinkname) 是在数据库连接被断开或超时以后又重连。
    Oracle好像默认20分钟没有任何操作连接将被断开。
    难道引起问题不在这个函数内?只是这个函数使用率较高,而且最先出现这个错误。
      

  3.   

    游标重复找开。或关闭后又找开。
    EXEC SQL OPEN 重复