Semplice query Oracle: il valore letterale non corrisponde alla stringa di formato
-
28-10-2019 - |
Domanda
Voglio eseguire una semplice funzione in Oracle.La firma è definita come segue:
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;
...
Dovrei essere in grado di eseguirlo con:
var rc refcursor
exec :rc := newcaselistforvalidation('2010-01-01','2011-01-01',100);
print :rc
Ma quando digito "newcaselistforvalidation ('2010-01-01', '2011-01-01', 100)", ottengo:
ERROR at line 1:
ORA-01861: literal does not match format string
ORA-06512: at line 1
Ho cercato un po 'su Google e sembra che non riesca a digitare la data nel formato corretto.Qualcuno può aiutarmi?
Soluzione
Interroga NLS_PARAMETERS in Oracle: sarai quindi in grado di vedere in quale formato il tuo DB accetta le date.
In genere, tuttavia, utilizzo la funzione to_date ():
to_date('01-01-2011','DD-MM-YYYY');
Nel Regno Unito per inserire le mie date.
Altri suggerimenti
Un'alternativa alla funzione to_date () è utilizzare il formato standard ANSI per i valori letterali DATE o TIMESTAMP:
DATE '2010-01-31' TIMESTAMP '2010-01-31 21:22:23'
La data e l'ora vengono sempre specificate utilizzando le regole ISO (AAAA-MM-GG e formato 24 ore per l'ora)
Funziona anche su molti altri DBMS (conformi agli standard).
È meglio non fare affidamento su un valore particolare nelle impostazioni di NLS_PARAMETERS , perché questo renderà la tua funzione interrotta nell'ambiente con un'altra NLS_DATE_FORMAT .
Specificherei esplicitamente la formattazione della data nella tua funzione come suggerito nella risposta sopra
exec :rc := newcaselistforvalidation(to_date('2010-01-01','YYYY-MM-DD'),to_date('2011-01-01','YYYY-MM-DD'),100);
INSERT INTO tblDate (dateStart) Valori ('20-GIU-2013 '); Se modifichi il numero intero del mese in una stringa "GG-MON-AAAA" funziona come una stringa di dati valida senza doverla anteporre all'identificatore DATE.