sql >> Base de Datos >  >> RDS >> Oracle

ORA-1843:no es un mes válido al actualizar el registro

Una fecha no tiene formato:se almacena internamente en la base de datos como 7 bytes (que representa año, mes, día, hora, minuto y segundo) y no es hasta que la interfaz de usuario que esté utilizando (es decir, SQL/Plus, SQL Developer, Java, etc.) intente mostrársela a usted, el usuario, y convierta en algo que encontraría significativo (generalmente una cadena) que la fecha tiene un formato.

Si proporciona una fecha formateada a un procedimiento, será una cadena y Oracle intentará convertirla implícitamente en una fecha usando NLS_DATE_FORMAT parámetro de sesión:

UPDATE your_table
SET your_date_column = '18-06-14'; -- or equivalently via a bind parameter

Se convierte implícitamente a

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

Si el NLS_DATE_FORMAT no coincide, Oracle generará una excepción (y cada usuario puede configurar el parámetro, por lo que no debe confiar en que sea consistente, especialmente en organizaciones internacionales donde el formato de fecha predeterminado depende de su territorio e idioma).

Si está actualizando el valor, use un DATE literal y no una cadena:

UPDATE your_table
SET your_date_column = DATE '2014-06-18';

O convierta explícitamente la cadena y proporcione el modelo de formato:

UPDATE your_table
SET your_date_column = TO_DATE( '18-06-14', 'DD-MM-RR' );

Lo mismo es cierto para pasar parámetros a su función. Utilice una DATE literal:

BEGIN
  your_procedure(
    p_launch_date => DATE '2014-06-18'
  );
END;
/

o convierta explícitamente la cadena en una fecha (y no confíe en la conversión implícita):

BEGIN
  your_procedure(
    p_launch_date => TO_DATE( '18-06-14', 'DD-MM-RR' )
  );
END;
/