我写了一个存储过程!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: 在要求输入数字处找到非数字字符’!
高手门看一下这个问题怎么解决阿?
--大队统计存储过程
( 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: 在要求输入数字处找到非数字字符’!
高手门看一下这个问题怎么解决阿?
我想问题可能是这里吧,你确定这个字段是数值类型,可以进行COUNT操作吗?
不是數值問題,而是count里面不能再加入distinct了。
建議把sql語句放到sqlplus里面測試通過后再寫到過程里面。
不是这的问题,我在sql*plus里面试过了,可以运行。
大家看一下是不是 TMP_V_TIME>=TO_DATE(M_START_DATE,'YYYY.MM.DD')
出现的问题啊?
我把TMP_V_TIME换成对应的 V.PUNISN_DATE或V.INTPUT_DATE都可以统计出来。是不是在ORACLE里面不能这样代替对应的变量啊?
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;