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