Einfache Oracle-Abfrage: Literal stimmt nicht mit Formatzeichenfolge überein
-
28-10-2019 - |
Frage
Ich möchte eine einfache Funktion in Oracle ausführen.Die Signatur ist wie folgt definiert:
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;
...
Ich sollte es ausführen können mit:
var rc refcursor
exec :rc := newcaselistforvalidation('2010-01-01','2011-01-01',100);
print :rc
Wenn ich jedoch "newcaselistforvalidation ('2010-01-01', '2011-01-01', 100)" eingebe, erhalte ich:
ERROR at line 1:
ORA-01861: literal does not match format string
ORA-06512: at line 1
Ich habe ein bisschen gegoogelt und es scheint, dass ich nicht herausfinden kann, ob ich das Datum in einem korrekten Format eingeben soll.Kann mir jemand helfen?
Lösung
Abfrage von NLS_PARAMETERS in Oracle - Sie können dann sehen, in welchem Format Ihre Datenbank Daten akzeptiert.
Normalerweise verwende ich jedoch die Funktion to_date ():
to_date('01-01-2011','DD-MM-YYYY');
In Großbritannien, um meine Daten einzugeben.
Andere Tipps
Eine Alternative zur Funktion to_date () ist die Verwendung des ANSI-Standardformats für DATE- oder TIMESTAMP-Literale:
DATE '2010-01-31' TIMESTAMP '2010-01-31 21:22:23'
Datum und Uhrzeit werden immer anhand von ISO-Regeln angegeben (JJJJ-MM-TT und 24-Stunden-Format für Zeit)
Dies funktioniert auch mit vielen anderen (standardkonformen) DBMS.
Es ist am besten, sich in den Einstellungen NLS_PARAMETERS nicht auf einen bestimmten Wert zu verlassen. Dadurch wird Ihre Funktion in der Umgebung mit einem anderen NLS_DATE_FORMAT unterbrochen.
Ich würde die Datumsformatierung in Ihrer Funktion explizit angeben, wie in der obigen Antwort vorgeschlagen
exec :rc := newcaselistforvalidation(to_date('2010-01-01','YYYY-MM-DD'),to_date('2011-01-01','YYYY-MM-DD'),100);
INSERT INTO tblDate (dateStart) Werte ('20 -JUN-2013 '); Wenn Sie die Monats-Ganzzahl in eine Zeichenfolge ändern, funktioniert 'TT-MON-JJJJ' als gültige Datenzeichenfolge, ohne dass der DATE-Bezeichner vorangestellt werden muss.