Validazione DATE
di Giulia Basiricò
Fonte: http://www.geocities.com/oracletricks/plsql/isdate.txt
Volete sapere se un determinato valore rappresenta
un formato di data valido? Allora questa funzione fa per voi!
CREATE OR REPLACE FUNCTION isdate
(p_data IN VARCHAR2) RETURN DATE IS
/***************************************************************************/
/* La funzione inizia con l'esecuzione
della to_date del parametro passato in input. */
/* Restituisce la data nel caso in
cui la conversione ha esito positivo. */
/* Se dovesse causare errore invece,
Oracle solleva un'eccezione che verrà */
/* gestita nell'EXCEPTION ... da
qui in poi un continuo propagarsi di eccezioni */
/* fino a quando non si arriva all'ultimo
when others then nel quale la funzione */
/* restituisce NULL. */
/***************************************************************************/
BEGIN
RETURN TO_DATE (p_data, 'yyyy/mm/dd' );
EXCEPTION
WHEN OTHERS THEN
BEGIN
RETURN
TO_DATE (p_data, 'yyyy-mm-dd');
EXCEPTION
WHEN
OTHERS THEN
BEGIN
RETURN TO_DATE (p_data, 'yyyy dd MON');
EXCEPTION
WHEN OTHERS THEN
BEGIN
RETURN TO_DATE (p_data,
'yy-mm-dd');
EXCEPTION
WHEN
OTHERS THEN
BEGIN
RETURN
TO_DATE (p_data, 'yy/mm/dd');
EXCEPTION
WHEN OTHERS THEN
BEGIN
RETURN
TO_DATE (p_data, 'yy-mm-dd');
EXCEPTION
WHEN
OTHERS THEN
BEGIN
RETURN TO_DATE (2439856 + p_data, 'j');
EXCEPTION
WHEN OTHERS THEN
RETURN TO_DATE (NULL);
END;
END;
END;
END;
END;
END;
END;
Qui di seguito
un po' di prove per "dimostrare" il funzionamento!
(La funzione può essere implementata
gestendo anche conversioni di date in altri fmt.
Qui è stato usato
il fmt. "anno mese giorno").
SQL> SELECT ISDATE('20040119') RISULTATO FROM DUAL
2 /
RISULTATO
--------------
19-GEN-04
SQL> SELECT ISDATE('2004/01/19') RISULTATO FROM DUAL
2 /
RISULTATO
--------------
19-GEN-04
SQL> SELECT ISDATE('2004-01-19') RISULTATO FROM DUAL
2 /
RISULTATO
--------------
19-GEN-04
SQL> SELECT ISDATE('GIULIA ') RISULTATO FROM DUAL
2 /
RISULTATO
--------------
SQL> SELECT ISDATE('2004/13/01') RISULTATO FROM DUAL
2 /
RISULTATO
--------------
- Notate che negli ultimi due casi la funzione ritorna null perchè il parametro passato
non rappresenta una data in fmt valido!