2014-02-18 78 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