Oracle 8在这里。
当一个日期传递给一个程序时,我可以传递''并且不会抛出任何东西。
MYDATE := ''
的测试未评估为真。 LENGTH < 1
也没有。 DBMS_OUTPUT不显示任何参数。
尝试传递'01-30-2009' (instead of 30-JAN-2009)
会引发无效的日期错误。
如何传递零长度字符串有效?
如何测试有效日期?
答案 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;
/