最近在开发中发生这样一件怪事儿:下面SQL
SELECT a.product_id,a.unit_id,a.status,a.AMOUNT,
       a.AMOUNT AMOUNTMONTH
  FROM tab_a a
       (SELECT NVL(SUM(AMOUNT), 0) AS AMOUNT, PRODUCT_ID, UNIT_ID, STATUS
          FROM tab_a
         WHERE P_DATE BETWEEN
               TRUNC(TO_DATE('2009-04-16', 'YYYY-MM-DD'), 'MONTH') + 1 AND
               TO_DATE('2009-04-16', 'YYYY-MM-DD')
         GROUP BY PRODUCT_ID, UNIT_ID, STATUS) b
 WHERE a.UNIT_ID = b.UNIT_ID
   AND a.STATUS = b.STATUS
   AND a.PRODUCT_ID = b.PRODUCT_ID
   AND a.P_DATE = TO_DATE('2009-04-16', 'YYYY-MM-DD')
中,如果但执行每个查询都没问题,但结合起来就直接导致“ORA-03113 通信通道的文件结束”
    后来发现如果加入这个条件“AND a.STATUS = b.STATUS”,就不发生错误或将where子句中的条件去掉一个。STATUS字段中保存的是中文字符。后来将AND “a.STATUS = b.STATUS”改成“AND decode(a.STATUS,'是','1','否','0') = decode(b.STATUS,'是','1','否','0')”
或者将“a.UNIT_ID = b.UNIT_ID
   AND a.STATUS = b.STATUS
   AND a.PRODUCT_ID = b.PRODUCT_ID”
改成
“a.UNIT_ID = b.UNIT_ID(+)
   AND a.STATUS = b.STATUS(+)
   AND a.PRODUCT_ID = b.PRODUCT_ID(+)”
或将where子句中其他的条件去掉一个就不会报此错误了。各位oracle高手谁能解释一下?

解决方案 »

  1.   

    sql语句写错了,应该为:
    SELECT a.product_id,a.unit_id,a.status,a.AMOUNT,
          b.AMOUNT AMOUNTMONTH
      FROM tab_a a
          (SELECT NVL(SUM(AMOUNT), 0) AS AMOUNT, PRODUCT_ID, UNIT_ID, STATUS
              FROM tab_a
            WHERE P_DATE BETWEEN
                  TRUNC(TO_DATE('2009-04-16', 'YYYY-MM-DD'), 'MONTH') + 1 AND
                  TO_DATE('2009-04-16', 'YYYY-MM-DD')
            GROUP BY PRODUCT_ID, UNIT_ID, STATUS) b
    WHERE a.UNIT_ID = b.UNIT_ID
      AND a.STATUS = b.STATUS
      AND a.PRODUCT_ID = b.PRODUCT_ID
      AND a.P_DATE = TO_DATE('2009-04-16', 'YYYY-MM-DD') 
      

  2.   

    没有发现什么地方有错。如果有的话就看看
    SELECT a.product_id,a.unit_id,a.status,a.AMOUNT,a.AMOUNT AMOUNTMONTH 
    这个中有两个a.AMOUNT,确定看其中一个是否为b.AMOUNT
      

  3.   

    这是Oracle10g的一个bug,该bug在10.2.0.3.0上存在,bug的表象就是引用有Check的字段作判断时就会报此错误。
      

  4.   

    这是Oracle10g的一个bug,该bug在10.2.0.3.0上存在,bug的表象就是引用有Check的字段作判断时就会报此错误。