我写了一个存储过程!CREATE OR REPLACE PROCEDURE WP_DDTJ_JWT
--大队统计存储过程
( M_RESULT OUT VARCHAR2,   --过程执行结果,1成功,-1过程内部错
  M_MSG OUT VARCHAR2,   --过程执行消息
  M_AREA_CODE           IN      VARCHAR2,   --统计单位代码,六位
  M_START_DATE          IN      VARCHAR2,   --格式:YYYY.MM.DD
  M_END_DATE            IN      VARCHAR2,   --格式:YYYY.MM.DD
  M_TYPE                IN      VARCHAR2,   --统计方式:'1'按处理时间统计,'2'按录入时间统计
  M_ZCLWZCS             OUT     NUMBER,     --总处理违章次数
)
IS
  V_ZCLWZCS                  NUMBER;     --总处理违章次数
  
  TMP_V_TIME      VARCHAR2(20);  --确定是用处理时间,还是录入时间BEGIN
     
     IF M_TYPE='1' THEN
        TMP_V_TIME:=' V.PUNISH_DATE';
     END IF;
     IF M_TYPE='2' THEN
       TMP_V_TIME:=' V.INPUT_DATE';
     END IF;
   select  count(distinct(violation_id)) INTO  V_ZCLWZCS  from w_violation v 
           where v.is_del='0' and v.Area_code=M_AREA_CODE
           and TMP_V_TIME>=TO_DATE(M_START_DATE,'YYYY.MM.DD')
           and TMP_V_TIME<=TO_DATE(M_END_DATE,'YYYY.MM.DD')+1;
           
   M_ZCLWZCS:=NVL(V_ZCLWZCS,0);
M_RESULT:='1';
  M_MSG:='统计已完成!';
EXCEPTION
  WHEN OTHERS THEN
 --   ROLLBACK;
    M_RESULT:='-1';
    M_MSG:=M_MSG||'统计过程错误! 错误信息:'||SUBSTR(SQLERRM,1,300);
END;
/  
我在执行select语句时,返回‘统计过程错误! 错误信息:ORA-01858: 在要求输入数字处找到非数字字符’!
高手门看一下这个问题怎么解决阿?

解决方案 »

  1.   

    count(distinct(violation_id))
    我想问题可能是这里吧,你确定这个字段是数值类型,可以进行COUNT操作吗?
      

  2.   

    count(distinct(violation_id))
    不是數值問題,而是count里面不能再加入distinct了。
    建議把sql語句放到sqlplus里面測試通過后再寫到過程里面。
      

  3.   

    count(distinct(violation_id))
    不是这的问题,我在sql*plus里面试过了,可以运行。
    大家看一下是不是  TMP_V_TIME>=TO_DATE(M_START_DATE,'YYYY.MM.DD')
    出现的问题啊?
    我把TMP_V_TIME换成对应的 V.PUNISN_DATE或V.INTPUT_DATE都可以统计出来。是不是在ORACLE里面不能这样代替对应的变量啊?
      

  4.   

    你可以用本机动态SQL实现你要的功能;
    EXECUTE IMMEDIATE 'select  count(distinct(violation_id)) from w_violation v 
               where v.is_del=''0'' and v.Area_code=M_AREA_CODE
               and :TMP_V_TIME>=TO_DATE(M_START_DATE,''YYYY.MM.DD'')
               and :TMP_V_TIME<=TO_DATE(M_END_DATE,''YYYY.MM.DD'')+1;'INTO V_ZCLWZCS  USING  TMP_V_TIME;