4
我想在Oracle中执行该代码10 SQL开发人员:本地函数
FUNCTION is_valid_date (p_val in VARCHAR2, p_format IN VARCHAR2)
RETURN numeric IS
l_date VARCHAR2(100);
BEGIN
l_date := TO_date(p_val, p_format);
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END is_valid_date;
BEGIN
DBMS_OUTPUT.PUT_LINE(is_valid_date('20120101', 'YYYYMMDD'));
END;
但我得到一个一般性错误,没有任何具体的Oracle代码,就好像它是一个语法问题。
我需要检查一个日期是否有效,因为没有内置的Oracle函数,所以我在脚本中定义了它(我不希望它是全局的或存储在某个地方)。
编辑:
我发现在使用Oracle正则表达式一个oracle论坛的解决方案,而不是一个功能。我的脚本是:
BEGIN
select * from mytable where not REGEXP_LIKE(mydatefield, '(((0[1-9]|[12]\d|3[01])\.(0[13578]|1[02])\.((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\.(0[13456789]|1[012])\.((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\.02\.((19|[2-9]\d)\d{2}))|(29\.02\.((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))')
END;
其中mydatefield的格式为DD.MM.YYYY
谢谢亚历克斯。这就是我得到的!无论如何,我不能使用我的功能,如果我更换(出现错误): DBMS_OUTPUT.PUT_LINE(is_valid_date('20120101','YYYYMMDD')); 与: 从DUAL选择is_valid_date('20120101','YYYYMMDD'); – user1630809
@ user1630809 - 不,不是来自普通SQL,因为它是PL/SQL块的本地,这正是你想要的。你不能两面都有。您可以在脚本开始时创建一个真正的函数,并在最后再次删除它,但这不是一个好方法,因为它会产生大量开销,并且DDL也会执行隐式提交,这可能会在一天内烧毁您。我不知道为什么你不想仅仅将它作为一个全局实用函数来创建,可能是一些有用的函数。这里你更广泛的目标是什么? –
当你说“它对于PL/SQL块是本地的”时,我不清楚:PUT_LINE和SELECT将处于相同的位置。在块的哪个部分可以使用sql语句,例如使用我的函数的select或update?我不允许在数据库中创建真正的功能。 – user1630809