Лично я думаю, что дата - это дата, а строка - это строка. Хотелось бы, чтобы был способ отключить неявное преобразование. Но если вы управляете программой, которая вызывает процедуру, вы можете попробовать:
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;
/