预编译到底是怎么工作的啊,
我用的是Oracle提供的预编译工具proc 
预编译的时候检查SQL语句的语法错误吗,访问数据库来检查吗。
我的程序中有代码是这样的
 EXEC SQL DECLARE cur_1 CURSOR FOR 
        select yslsh,yslb,ysdf,nvl(yjdf,0),to_char(wyjqzrq,'yyyyMMdd'),to_char(dl,'000000000000'),ny, 
        (select khlb from kh_jbxx where khbh = :khbh and nvl(zzny,'999901') >= to_char(sysdate,'yyyymm')) sfjmh,to_char(xcsj,'yyyy-mm-dd')
      FROM zw_dfyssekf
      where nvl(wyjjmbz,'0') = '0'
        and khbh = :khbh
        and nvl(hbbz,'0') <> '1'
     order by yslsh;
    EXEC SQL OPEN cur_1; 
    if (sqlca.sqlcode == 0 )  //数据库繁忙引发的错误
{
''''''//错误
}
预编译的时候报告下面的错误
语法错误出现在208行,17列, 文件bankquerydf.pc:
错误发生在行208, 列17, 文件bankquerydf.pc
        (select khlb from kh_jbxx where khbh = :khbh and nvl(zzny,'999901') >= to_char(sysdate,'yyyymm')) sfjmh,to_char(xcsj,'yyyy-mm-dd')
................1
PCC-S-02201, 出现符号 "khlb"在需要下列之一时:
 ( ) * + - / . @ | at, day,
   hour, minute, month, second, year,
符号 ")" 被替换为 "khlb" 后继续。语法错误出现在208行,105列, 文件bankquerydf.pc:
错误发生在行208, 列105, 文件bankquerydf.pc
        (select khlb from kh_jbxx where khbh = :khbh and nvl(zzny,'999901') >= to_char(sysdate,'yyyymm')) sfjmh,to_char(xcsj,'yyyy-mm-dd')
........................................................................................................1
PCC-S-02201, 出现符号 ")"在需要下列之一时:
 ; * + - / | for, union, at,
   connect, and, group, having, intersect, minus, or, order,
   start, with, day, hour, minute, month, second, year,
sql语句保证没有错误,可是报告的全是SQL语句的错误,到底是怎么回事,
请哪位大侠不吝赐教  [email protected]
不生感激。

解决方案 »

  1.   

    你什么能够保证sql语句没错呢?
    代码帖出来不完整,什么帮你看
      

  2.   

    单独 把SQL语句拷贝出来执行没有问题,
    该部分的代码为:  //处理欠费
      EXEC SQL DECLARE cur_1 CURSOR FOR 
            select  yslsh,yslb,ysdf,nvl(yjdf,0),to_char(wyjqzrq,'yyyyMMdd'),to_char(dl,'000000000000'),ny, 
                (select khlb from kh_jbxx where khbh = :khbh and nvl(zzny,'999901') >= to_char(sysdate,'yyyymm')) sfjmh,to_char(xcsj,'yyyy-mm-dd')
            from zw_dfyssekf 
          where nvl(wyjjmbz,'0') = '0'
            and khbh = :khbh
            and nvl(hbbz,'0') <> '1'
         order by yslsh;
        EXEC SQL OPEN cur_1; 
        if (sqlca.sqlcode == 0 )  //数据库繁忙引发的错误
       {
        strcat(returnchr,"22");           //返回标志
        strcat(returnchr,yhdm);           //银行代码
        strcat(returnchr,"        14");    //返回标志前有8个空格
        tpreturn(TPSUCCESS,0,returnchr,0,0);
       }由于设计到银行的东西,不便将代码全部贴出,不过错误只涉及到该部分代码,象您这样的大侠应该看出什么问题了吧。
      

  3.   

    问题找到:字段与表名不对应!select yslsh,
           yslb,
           ysdf,
           nvl(yjdf, 0),
           to_char(wyjqzrq, 'yyyyMMdd'),
           to_char(dl, '000000000000'),
           ny,
           (select khlb
              from kh_jbxx
             where khbh = :khbh
               and nvl(zzny, '999901') >= to_char(sysdate, 'yyyymm')) sfjmh,

           to_char(xcsj, 'yyyy-mm-dd')
      from zw_dfyssekf