在oracle过程参数中测试有效日期

时间:2009-06-09 00:09:03

标签: oracle

Oracle 8在这里。

当一个日期传递给一个程序时,我可以传递''并且不会抛出任何东西。

MYDATE := ''的测试未评估为真。 LENGTH < 1也没有。 DBMS_OUTPUT不显示任何参数。

尝试传递'01-30-2009' (instead of 30-JAN-2009)会引发无效的日期错误。

如何传递零长度字符串有效?

如何测试有效日期?

2 个答案:

答案 0 :(得分:5)

在Oracle的更高版本中,空字符串被视为与NULL相同。这可能就是你遇到的。

您可以将参数设置为非null,然后它应该出错。 (正如Jeffery Kemp在评论中指出的那样,你不能对参数使用not null)

就无效日期错误而言,如果字符串格式为dd-mmm-yyyy,Oracle将隐式地将字符串转换为日期。否则你必须使用适当的掩码通过to_date运行它。

我不熟悉Oracle 8,所以我不确定什么是新的。希望这会有所帮助。

答案 1 :(得分:2)

就个人而言,我认为日期是日期,字符串是字符串。我希望有一种方法可以禁用隐式转换。但是如果您控制调用该过程的程序,您可以尝试:

call my_proc(to_date('01-30-2009','MM-DD-YYYY'));

而不是:

call my_proc('01-30-2009');

否则,让你的过程接收一个字符串并检查过程中的格式:

create procedure my_proc(p_date_str in varchar2) is
  v_dt date;

begin
  if length(v_dt) != 10 then
    raise_application_error(-20000,'Wrong date format',true);
  end if;
  v_dt := to_date(p_date_str,'MM-DD-YYYY');
  ... now use v_dt as a date ...
end;
/