Consulta simple de Oracle: el literal no coincide con la cadena de formato
-
28-10-2019 - |
Pregunta
Quiero ejecutar una función simple en Oracle.La firma se define de la siguiente manera:
CREATE OR REPLACE FUNCTION NewCaseListForValidation
(
p_fromDate in DATE,
p_toDate in DATE,
p_rowCount in INT
)
RETURN
SYS_REFCURSOR
IS
return_value SYS_REFCURSOR;
...
Debería poder ejecutarlo con:
var rc refcursor
exec :rc := newcaselistforvalidation('2010-01-01','2011-01-01',100);
print :rc
Pero al escribir "newcaselistforvalidation ('2010-01-01', '2011-01-01', 100)", obtengo:
ERROR at line 1:
ORA-01861: literal does not match format string
ORA-06512: at line 1
Busqué en Google un poco y parece que no puedo escribir la fecha en el formato correcto.¿Alguien puede ayudarme?
Solución
Consulte NLS_PARAMETERS en Oracle; luego podrá ver en qué formato acepta fechas su base de datos.
Sin embargo, normalmente uso la función to_date ():
to_date('01-01-2011','DD-MM-YYYY');
En el Reino Unido para ingresar mis fechas.
Otros consejos
Una alternativa a la función to_date () es usar el formato estándar ANSI para los literales DATE o TIMESTAMP:
DATE '2010-01-31' TIMESTAMP '2010-01-31 21:22:23'
La fecha y la hora siempre se especifican mediante las reglas ISO (AAAA-MM-DD y formato de 24 horas para la hora)
Esto también funciona en muchos otros DBMS (que cumplen con los estándares).
Es mejor no confiar en un valor particular en la configuración de NLS_PARAMETERS , porque esto hará que su función se rompa en el entorno con otro NLS_DATE_FORMAT .
Especificaría explícitamente el formato de fecha en su función como se sugiere en la respuesta anterior
exec :rc := newcaselistforvalidation(to_date('2010-01-01','YYYY-MM-DD'),to_date('2011-01-01','YYYY-MM-DD'),100);
INSERT INTO tblDate (dateStart) Valores ('20 -JUN-2013 '); Si cambia el entero del mes a una cadena, 'DD-MON-YYYY' funciona como una cadena de datos válida sin tener que ir precedida del identificador DATE.