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

ORA-1843:não é um mês válido ao atualizar o registro


Uma data não tem um formato - ela é armazenada internamente no banco de dados como 7 bytes (representando ano, mês, dia, hora, minuto e segundo) e não é até que qualquer interface de usuário que você esteja usando (ou seja, SQL/Plus, SQL Developer, Java, etc.) em algo que você acharia significativo (geralmente uma string) que a data tem um formato.

Se você estiver fornecendo uma data formatada para um procedimento, ela será uma string e o Oracle tentará convertê-la implicitamente em uma data usando o NLS_DATE_FORMAT parâmetro de sessão:
UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter

É implicitamente convertido para
UPDATE your_table
SET your_date_column = TO_DATE(
                         '18-06-14',
                         ( SELECT value
                           FROM   NLS_SESSION_PARAMETERS
                           WHERE  parameter = 'NLS_DATE_FORMAT' )
                       );

Se o NLS_DATE_FORMAT não corresponder, o Oracle lançará uma exceção (e o parâmetro pode ser definido por cada usuário, portanto, você não deve confiar que ele seja consistente - especialmente em organizações internacionais quando o formato de data padrão depende de seu território e idioma).

Se você estiver atualizando o valor, use um DATE literal e não uma string:
UPDATE your_table
SET your_date_column = DATE '2014-06-18';

Ou converta explicitamente a string e forneça o modelo de formato:
UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );

O mesmo vale para passar parâmetros para sua função. Ou use um DATE literal:
BEGIN
  your_procedure(
    p_launch_date => DATE '2014-06-18'
  );
END;
/

ou converta explicitamente a string para uma data (e não confie na conversão implícita):
BEGIN
  your_procedure(
    p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
  );
END;
/