【问题标题】:Error processing validation. ORA-06502: PL/SQL: numeric or value error: character to number conversion error错误处理验证。 ORA-06502: PL/SQL: 数字或值错误: 字符到数字的转换错误
【发布时间】:2013-12-24 13:32:49
【问题描述】:

我有 period=3day/week/month 、 start_date 和 end_date。当我选择 start_date 例如。 2013 年 12 月 12 日.. 然后我想验证 end_date 大约是 start_date + period(3day) + 2day(default).. 所以 end_date 将是 16-DEC-2013.. 我在这里写了代码..

declare

v_period date;

begin

if :P104_TYPE_PERIOD = 'DAY' then
v_period  := ((TO_DATE(:P104_START_DATE, 'DD-MON-YYYY')+(nvl(to_number(replace(:P104_COURSE_PERIOD,',', '0'))),0)))+2);
end if;

if :P104_TYPE_PERIOD = 'WEEK' then
v_period  := ((TO_DATE(:P104_START_DATE, 'DD-MON-YYYY')+(nvl(to_char(to_number(replace(:P104_COURSE_PERIOD,',', '0'))),0)*7))+2);
end if;

if :P104_TYPE_PERIOD = 'MONTH' then
v_period  := ((TO_DATE(:P104_START_DATE, 'DD-MON-YYYY')+(nvl(to_char(to_number(replace(:P104_COURSE_PERIOD,',', '0'))),0)*30))+2);
end if;

if v_period  < :P104_END_DATE then
return false;
end if; 
end;

运行页面后,出现以下消息:

Error processing validation.
ORA-06502: PL/SQL: numeric or value error: character to number conversion error

有谁知道如何解决这个问题? 提前谢谢!

【问题讨论】:

  • period=3day ?您不能将3day 转换为数字,这会导致转换错误。
  • 其实那 3 天我使用了不同的项目.. P104_COURSE_PERIOD=3 P104_TYPE_PERIOD=DAY.. 这就是我放在那里的原因,
  • 如果 :P104_TYPE_PERIOD = 'MONTH' 那么 v_period := ((TO_DATE(:P104_START_DATE, 'DD-MON-YYYY')+(nvl(to_char(to_number(replace(:P104_COURSE_PERIOD,',' , '0'))),0)*30))+2);如果结束;
  • 能否请您先在 BEGIN 块中打印所有以 ':' 开头的主机变量并显示输出。?
  • :P104_COURSE_PERIOD = 3

标签: javascript oracle jquery oracle11g oracle10g


【解决方案1】:

假设:P104_COURSE_PERIODNUMBER

您的块正在用零替换逗号,如果它不是NUMBER,您能否提供可能的值。

   declare
        v_period date;
        v_date_offset_factor NUMBER;
    begin
        if :P104_TYPE_PERIOD = 'DAY' then
            v_date_offset_factor := 1;
        ELSIF :P104_TYPE_PERIOD = 'WEEK' then
            v_date_offset_factor := 7;
        ELSIF :P104_TYPE_PERIOD = 'MONTH' then
            v_date_offset_factor := 30;
        END IF;
        v_period  := TO_DATE(:P104_START_DATE, 'DD-MON-YYYY') + (:P104_COURSE_PERIOD * v_date_offset_factor ) + 2;
        if v_period  < TO_DATE(:P104_END_DATE,'DD-MON-YYYY') then
            return false; -- Do you return something?
        end if; 
    EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line( SQLERRM||chr(10)||dbms_utility.format_error_backtrace );
    end;

请试试上面的PL/SQL

需要注意: 你把日期乘以 30,我猜你做了一些月份的计算,但也有月份有 28 天和 31 天。你考虑过他们吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多