2014-02-18 31 views
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

回答

11

如果这是你的整个脚本,你错过the DECLARE keyword at the start of your anonymous block

DECLARE 
    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; 
/

anonymous block completed 
1 

如果没有,你会得到一系列的错误开始

Error starting at line : 1 in command - 
FUNCTION is_valid_date (p_val in VARCHAR2, p_format IN VARCHAR2) 
Error report - 
Unknown Command 

......我想象的是'泛型错误你提到的。

+0

谢谢亚历克斯。这就是我得到的!无论如何,我不能使用我的功能,如果我更换(出现错误): DBMS_OUTPUT.PUT_LINE(is_valid_date('20120101','YYYYMMDD')); 与: 从DUAL选择is_valid_date('20120101','YYYYMMDD'); – user1630809

+1

@ user1630809 - 不,不是来自普通SQL,因为它是PL/SQL块的本地,这正是你想要的。你不能两面都有。您可以在脚本开始时创建一个真正的函数,并在最后再次删除它,但这不是一个好方法,因为它会产生大量开销,并且DDL也会执行隐式提交,这可能会在一天内烧毁您。我不知道为什么你不想仅仅将它作为一个全局实用函数来创建,可能是一些有用的函数。这里你更广泛的目标是什么? –

+0

当你说“它对于PL/SQL块是本地的”时,我不清楚:PUT_LINE和SELECT将处于相同的位置。在块的哪个部分可以使用sql语句,例如使用我的函数的select或update?我不允许在数据库中创建真正的功能。 – user1630809