主机:Aix5.3
编译:gcc代码很简单:
        int i;
        char    cftp_usr[21];
        sprintf(username,"test");
        sprintf(password,"test");
        sprintf(dbhost,"cur.test.com");
        memset(cftp_usr,0,sizeof(cftp_usr));
        EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n");
        EXEC SQL WHENEVER NOTFOUND DO nothing();
        EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbhost;
        /*下一句执行错误 */
        EXEC SQL SELECT ftp_user into :cftp_usr FROM KPI_FTP_INFO where busi_type=1;
        
        /* 正常 */
        EXEC SQL select kpi_op_accept.nextval into :op_accept from dual;        EXEC SQL COMMIT WORK;
用dbx跟踪后:
"sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);" is executed.Illegal instruction (reserved addressing fault) in . at 0x0 ($t1)
0x00000000 00000000 Invalid opcode.

解决方案 »

  1.   

    应该这样写吧? 变量 cftp_usr前没有冒号
    EXEC SQL SELECT ftp_user into cftp_usr FROM KPI_FTP_INFO where busi_type=1; 
      

  2.   

    core dump怎么怎么下一句正常呢?另:你的变量没有放在sql通讯区定义
      

  3.   

    cftp_usr长度够的,比数据库长一位。
    sql变量我是单独贴过来的,在通讯区定义的。
    后面那一句是出错后将cftp_usr注释能通过,所以对char很疑惑,因为在通讯区分别尝试过varchar和char,都是出错。
    cftp_usr不加冒号我还真没尝试过,因为这个是移植过来的程序,在另外的主机上能正常运行,同样是aix5.3。
    唯一的区别是原数据库客户端是9i后来的是10g。
      

  4.   

    cftp_usr不加冒号也是一样的错。
      

  5.   

    在头上加入
    EXEC SQL INCLUDE sqlca;
    #define SQLCODE sqlca.sqlcode在出错的那句加
    if(SQLCODE)
    printf("[ERR=%d]\r\n",SQLCODE);然后用 oerr
    看下具体是什么错.
      

  6.   

    sqlca这些头文件已经包含了。
    而且这个错误没有被sqlcode截获。直接就是coredump了。
    现在郁闷的很,这个错误如果不能解决,就考虑是否需要用proc了。
      

  7.   

    不可能吧,这么简单的SQL也CORE。
    而且CORE在了oracle的库函数里面。
    你的客户端装的有没有问题啊?
    你把你的客户端版本写出来看看。
      

  8.   

    你的代码
    [code]
            int i; 
           char    cftp_usr[21]; [/code]明显没有放在通讯区里面