项目中 一个sqx文件新增了个sql (类似下面这个,省略掉了大部分内容):
select A.APP_SNO, (SELECT COUNT(1) FROM OTC_MATCHED B WHERE A.APP_SNO = B.APP_SNO AND A.APP_DATE = B.APP_DATE) AS MATCHED_CNT  
FROM OTC_QUOTE A;proc 预编译报错。(脚本命令没改过,项目都是用这个)
proc def_sqlcode=yes release_cursor=yes sqlcheck=syntax ireclen=256 parse=none code=cpp cpp_suffix=cpp DBMS=V8 unsafe_null=yes char_map=string %BUILD_FILE%.sqx  ,(SELECT C
1>OUNT(1) FROM OTC_MATCHED B WHERE A.APP_SNO = B.APP_SNO AND A.APP_DATE = B.APP_DA
1>TE) AS MATCHED_CNT 
1>................................................................................
1>................................................................................
1>................................................................................
1>................................................................................
1>................................................................................
1>................................................................................
1>...............................................................................1
1>PCC-S-02201, 出现符号 "COUNT"在需要下列之一时:
1> ( ) * + - / . @ | at,
1>   day, hour, minute, month, second, year,
1>符号 "(" 被替换为 "COUNT" 后继续。
1>语法错误出现在3646行,569列,

解决方案 »

  1.   

    oracle 客户端版本 11g
      

  2.   

    单独 把语句 拿出来 在sqlplus  运行下就能看到是不是 sql的问题了
      

  3.   


    在plsql里面跑sql没问题
    难道是proc 不支持这种写法? 去掉子查询, sqx就能预编译过.
      

  4.   


    在plsql里面跑sql没问题
    难道是proc 不支持这种写法? 去掉子查询, sqx就能预编译过.
    你把这一段 写在 procedure里面的?
    oracle语句块里面 不支持只写 select  要into到变量中
      

  5.   


    在plsql里面跑sql没问题
    难道是proc 不支持这种写法? 去掉子查询, sqx就能预编译过.
    你把这一段 写在 procedure里面的?
    oracle语句块里面 不支持只写 select  要into到变量中不是在procedure里面写的。
    我还是把源码贴出来吧。。
    int CDAOOtcQuote::Select_ESQL(ST_OTC_QUOTE_EV9 *p_pstOtcQuoteEv9, int p_iSize, int &p_refiCount,
                                  const ST_OTC_QUOTE_EX9 &p_refstOtcQuoteEx9)
    {
      EXEC SQL INCLUDE SQLCA;
      EXEC SQL BEGIN DECLARE SECTION;
      ...变量定义
      EXEC SQL END DECLARE SECTION;
      int iRetCode = RTMSG_OK;
      bool bCloseCursor = false;
      p_refiCount = 0;
      if (p_pstOtcQuoteEv9 != NULL && p_iSize > 0)
      {
        memset((void *)p_pstOtcQuoteEv9, 0x00, sizeof(ST_OTC_QUOTE_EV9) * p_iSize);
        if (!CURSOR_IS_OPENED(m_uCMOtcQuoteEx9))
        {
          // 条件宿主变量赋值
         ...
          // 定义游标
          //{{COMPATIBILITY(DATABASE_IS_ORACLE)
          EXEC SQL DECLARE C_OTCQUOTEEX9 CURSOR FOR
                   SELECT * 
                   FROM ( 
                   SELECT ROWNUM REC_NUM,APP_SNO, APP_DATE, APP_TIMESTAMP, CUST_CODE, CUST_NAME, CUACCT_CODE, EXT_TA_CODE, ORG_CODE, TA_ACCT, TRANS_ACCT, EXT_ISS_CODE, INST_CODE, INST_ID, INST_SNAME, INST_TYPE, INST_CLS, HOLD_YIELD, SELL_PRICE, SELL_QTY, ORD_FRZ_QTY, SELL_MATCHED_QTY, ORD_UNFRZ_AMT, UNFRZ_AMT, RET_AMT, REDEEM_QTY, REDEEM_AMT, REDEEM_APP_SNO, REDEEM_APP_DATE, UNFRZ_QTY, CANCEL_FLAG, CANCELED_FLAG, CAN_CANCEL, CANCEL_CHNL, VALID_DATE, ORD_STAT, OP_CHNL, UNMATCH_DEAL_WAY, REMARK,MATCHED_CNT 
                   FROM 
                   ( 
                   SELECT (  A.APP_SNO,A.APP_DATE,A.APP_TIMESTAMP,A.CUST_CODE,A.CUST_NAME,A.CUACCT_CODE,F.EXT_TA_CODE,A.ORG_CODE,A.TA_ACCT,A.TRANS_ACCT,E.EXT_ISS_CODE,A.INST_CODE,A.INST_ID,A.INST_SNAME,A.INST_TYPE,A.INST_CLS,A.HOLD_YIELD,A.SELL_PRICE,A.SELL_QTY,A.ORD_FRZ_QTY,A.SELL_MATCHED_QTY,A.ORD_UNFRZ_AMT,A.UNFRZ_AMT,A.RET_AMT,C.ORD_QTY AS REDEEM_QTY,C.ORD_AMT AS REDEEM_AMT,A.REDEEM_APP_SNO,A.REDEEM_APP_DATE,A.UNFRZ_QTY,A.CANCEL_FLAG,A.CANCELED_FLAG,A.CAN_CANCEL,D.OP_CHNL AS CANCEL_CHNL,A.VALID_DATE,A.ORD_STAT,A.OP_CHNL,A.UNMATCH_DEAL_WAY,A.REMARK, SELECT COUNT(*) FROM OTC_MATCHED B WHERE A.APP_SNO = B.APP_SNO AND A.APP_DATE = B.APP_DATE) AS MATCHED_CNT 
                   FROM OTC_QUOTE A,OTC_TRD_ORDERS C,OTC_QUOTE D,OTC_INST_ORG E,OTC_INST_ORG F 
                   WHERE A.ISS_CODE = E.INST_ORG_SNO 
                     AND A.TA_CODE = F.INST_ORG_SNO 
                     AND A.REDEEM_APP_SNO = C.APP_SNO(+) 
                     AND A.REDEEM_APP_DATE = C.APP_DATE(+) 
                     AND A.APP_SNO = D.ORI_APP_SNO(+) 
                     AND A.APP_DATE = D.ORI_APP_DATE(+) 
                     AND A.APP_DATE >=:iBgnDate_EX9W AND A.APP_DATE <= :iEndDate_EX9W 
                     AND (A.APP_SNO = :szAppSno_EX9W OR TRIM(:szAppSno_EX9W) IS NULL) 
                     AND (A.CUST_CODE = :llCustCode_EX9W OR :llCustCode_EX9W = 0) 
                     AND (A.CUACCT_CODE = :llCuacctCode_EX9W OR :llCuacctCode_EX9W = 0) 
                     AND (E.EXT_ISS_CODE = :szExtIssCode_EX9W OR TRIM(:szExtIssCode_EX9W) IS NULL) 
                     AND (A.INST_CODE = :szInstCode_EX9W OR TRIM(INST_CODE) IS NULL) 
                     AND (A.INST_ID = :szInstId_EX9W OR TRIM(INST_ID) IS NULL) 
                   ORDER BY APP_DATE DESC ,APP_SNO ASC  
                   )) D WHERE ((D.REC_NUM BETWEEN :iPageRecnum_EX9W AND (:iPageRecnum_EX9W + :iPageReccnt_EX9W - 1)) OR (:iPageRecnum_EX9W= 0 AND :iPageReccnt_EX9W = 0));
          //}}COMPATIBILITY
          EXEC SQL OPEN C_OTCQUOTEEX9;
          if (SQLCODE != SQLCODE_OK)
          {
            throw CException(RUNTIME_TRACE(), sqlca, "OPEN C_OTCQUOTEEX9");
          }
          CURSOR_OPENED(m_uCMOtcQuoteEx9);
        }
        while (p_refiCount < p_iSize)
        {
          EXEC SQL FETCH C_OTCQUOTEEX9
                         INTO :iRecNum_EX9, :szAppSno_EX9, :iAppDate_EX9, :szAppTimestamp_EX9, :llCustCode_EX9, 
                              :szCustName_EX9, :llCuacctCode_EX9, :szExtTaCode_EX9, :siOrgCode_EX9, :szTaAcct_EX9, 
                              :szTransAcct_EX9, :szExtIssCode_EX9, :szInstCode_EX9, :szInstId_EX9, :szInstSname_EX9, 
                              :szInstType_EX9, :szInstCls_EX9, :llHoldYield_EX9, :llSellPrice_EX9, :llSellQty_EX9, 
                              :llOrdFrzQty_EX9, :llSellMatchedQty_EX9, :llOrdUnfrzAmt_EX9, :llUnfrzAmt_EX9, :llRetAmt_EX9, 
                              :llRedeemQty_EX9, :llRedeemAmt_EX9, :szRedeemAppSno_EX9, :iRedeemAppDate_EX9, :llUnfrzQty_EX9, 
                              :szCancelFlag_EX9, :szCanceledFlag_EX9, :szCanCancel_EX9, :szCancelChnl_EX9, :iValidDate_EX9, 
                              :szOrdStat_EX9, :szOpChnl_EX9, :szUnmatchDealWay_EX9, :szRe_EX9, :iMatchedCnt_EX9;
          if (SQLCODE == SQLCODE_NO_DATA)
          {
            bCloseCursor = true;
            break;
          }
          else if (SQLCODE != SQLCODE_OK)
          {
            CException clException(RUNTIME_TRACE(), sqlca, "FETCH C_OTCQUOTEEX9 INTO ...");
            EXEC SQL CLOSE C_OTCQUOTEEX9;
            CURSOR_CLOSED(m_uCMOtcQuoteEx9);
            throw clException;
          }
         ....
    预编译sqx 报错:
    1>语法错误出现在3648行,35列, 文件C:\KBSS_BUILD\D41D8CD98F00B204E9800998ECF8427E\dao_otcquote.sqx: 
    1>错误发生在行3648, 列35, 文件C:\KBSS_BUILD\D41D8CD98F00B204E9800998ECF8427E\dao_otcquote.s
    1>qx
    1>               SELECT (  A.APP_SNO,A.APP_DATE,A.APP_TIMESTAMP,A.CUST_CODE,A.CUST
    1>_NAME,A.CUACCT_CODE,F.EXT_TA_CODE,A.ORG_CODE,A.TA_ACCT,A.TRANS_ACCT,E.EXT_ISS_CO
    1>DE,A.INST_CODE,A.INST_ID,A.INST_SNAME,A.INST_TYPE,A.INST_CLS,A.HOLD_YIELD,A.SELL
    1>_PRICE,A.SELL_QTY,A.ORD_FRZ_QTY,A.SELL_MATCHED_QTY,A.ORD_UNFRZ_AMT,A.UNFRZ_AMT,A
    1>.RET_AMT,C.ORD_QTY AS REDEEM_QTY,C.ORD_AMT AS REDEEM_AMT,A.REDEEM_APP_SNO,A.REDE
    1>EM_APP_DATE,A.UNFRZ_QTY,A.CANCEL_FLAG,A.CANCELED_FLAG,A.CAN_CANCEL,D.OP_CHNL AS 
    1>CANCEL_CHNL,A.VALID_DATE,A.ORD_STAT,A.OP_CHNL,A.UNMATCH_DEAL_WAY,A.REMARK, SELEC
    1>T COUNT(*) FROM OTC_MATCHED B WHERE A.APP_SNO = B.APP_SNO AND A.APP_DATE = B.APP
    1>_DATE) AS MATCHED_CNT 
    1>..................................1
    1>PCC-S-02201, 出现符号 ","在需要下列之一时:
    1> ( ) * + - / . @ | at, day,
    1>   hour, minute, month, second, year,
    1>符号 ")" 被替换为 "," 后继续。这个sql 在plsql里面执行没问题. 如果是proc不支持子查询这种写法,有其他写法替换下嘛? 暂时只考虑绑定变量的静态sql这种方式。