Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Convertendo uma String para Data e gerando uma exceção quando a String fornecida é inválida


Existem muitas exceções que podem ser lançadas pelo TO_DATE função. Exemplos:
  • ORA-01843 - Valor do mês inválido
  • ORA-01847 - Valor do dia inválido
  • ORA-01830 - a imagem do formato de data termina antes de converter toda a string de entrada
  • ...

Você pode pegá-los como no exemplo a seguir (com apenas uma exceção):
Create or Replace Procedure A1SF_TESTDATE
(
    pDateStr Varchar2

    -- you must do this for every oracle exception number which will you catch
    bad_month EXCEPTION;
    PRAGMA EXCEPTION_INIT (bad_month, -01843);
)As
    tDate Date;
    Begin
    tdate := TO_DATE(pDateStr, 'yyyymmdd');
    dbms_output.put_line(tdate);
    Exception 
      When bad_month Then
        dbms_output.put_line('The format provided is incorrect');

End;

Mas para isso você deve definir n pragmas!

A solução mais fácil, que eu prefiro, é:
Create or Replace Procedure A1SF_TESTDATE
    (
        pDateStr Varchar2
    )As
        tDate Date;
Begin
        tdate := TO_DATE(pDateStr, 'yyyymmdd');
        dbms_output.put_line(tdate);
        Exception 
          -- every exception will be catched
          When others Then
            dbms_output.put_line('The format provided is incorrect! Because: ' || SQLERRM);

 End;

Uma possível mensagem para SQLERRM é ORA-01847: day of month must be between 1 and last day of month .