'02.01.15 12:00:00'
एक तारीख नहीं है यह एक स्ट्रिंग है; यदि आप इसे DATE
. में सम्मिलित करने का प्रयास कर रहे हैं डेटा प्रकार कॉलम तो Oracle इसके समकक्ष का उपयोग करके किसी तिथि पर डालने का प्रयास करेगा:
SELECT TO_DATE(
'02.01.15 12:00:00',
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
) as CHANGED
FROM DUAL
तो अगर आपका NLS_DATE_FORMAT
सत्र पैरामीटर आपकी स्ट्रिंग के प्रारूप से मेल नहीं खाता '02.01.15 12:00:00'
तो यह एक अपवाद उठाएगा - और ऐसा तब हो रहा है जब आपको ORA-01843: not a valid month
मिल रहा है। ।
सबसे अच्छा समाधान यह है कि स्ट्रिंग को स्पष्ट रूप से किसी तिथि पर डालने के लिए अपनी स्क्रिप्ट को संशोधित करें:
MERGE INTO A config
USING (
SELECT 100 as id,
TO_DATE( '02.01.15 12:00:00', 'DD.MM.YY HH24:MI:SS' ) as CHANGED,
0 as DELETED,
1 as B
FROM DUAL
) src ON (src.id = config.id)
WHEN NOT MATCHED THEN
INSERT(id,CHANGED, DELETED, B) VALUES(src.id, src.CHANGED, src.DELETED, src.B)
WHEN MATCHED THEN
UPDATE SET config.B = src.B;
या टाइमस्टैम्प शाब्दिक का उपयोग करने के लिए:TIMESTAMP '2015-01-02 12:00:00'
लेकिन आप NLS_DATE_FORMAT
. को बदलने के लिए लॉगऑन ट्रिगर भी बना सकते हैं सत्र पैरामीटर। इस कोड के चारों ओर ट्रिगर लपेटें:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
हालांकि, यह सभी निहित रूपांतरणों में उपयोग किए जाने वाले दिनांक प्रारूप को स्ट्रिंग से तिथि (और इसके विपरीत) में बदल देगा, इसलिए अन्य प्रश्नों को तोड़ सकता है जो ऐसे निहित रूपांतरणों पर भी निर्भर करते हैं। साथ ही, प्रत्येक उपयोगकर्ता अपने सत्र पैरामीटर को किसी भी समय बदल सकता है इसलिए लॉग ऑन पर इस डिफ़ॉल्ट को सेट करना उन पर निर्भर करता है कि वे अपने सत्र के दौरान इसे कभी नहीं बदलते।
[TL;DR] अंतर्निहित रूपांतरणों के लिए उपयोग किए गए प्रारूप मॉडल को संशोधित करने के बजाय डेटा प्रकारों के बीच निहित रूपांतरणों का उपयोग न करने के लिए अपनी स्क्रिप्ट को ठीक करें।