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;
/