Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

दिनांक मान के साथ IN पैरामीटर प्रक्रिया निष्पादित करते समय मान्य माह नहीं है

आपकी प्रक्रिया timestamp . प्रकार के पैरामीटर लेती है . आप वास्तव में varchar2 . प्रकार के पैरामीटर पास कर रहे हैं आपके कॉल में। यह Oracle को varchar2 . का अंतर्निहित रूपांतरण करने के लिए बाध्य करता है timestamp . के पैरामीटर अपने सत्र के NLS_TIMESTAMP_FORMAT . का उपयोग करके . यह अलग-अलग सत्रों के लिए अलग-अलग होगा, इसलिए संभव है कि कम से कम कुछ सत्रों में त्रुटि हो क्योंकि स्ट्रिंग उस सत्र के NLS_TIMESTAMP_FORMAT के प्रारूप से मेल नहीं खाती है। . to_timestamp को स्पष्ट रूप से कॉल करके आपको वास्तविक टाइमस्टैम्प में पास करने के लिए बेहतर सेवा दी जाएगी या टाइमस्टैम्प शाब्दिक पास करके।

तब आपकी प्रक्रिया timestamp . लेती है पैरामीटर और उन्हें to_date . पर पास करें समारोह। to_date फ़ंक्शन timestamp . प्रकार के पैरामीटर नहीं लेता है , यह केवल varchar2 . प्रकार के पैरामीटर लेता है . यह Oracle को timestamp . का एक और अंतर्निहित रूपांतरण करने के लिए बाध्य करता है varchar2 . के पैरामीटर , फिर से सत्र के NLS_TIMESTAMP_FORMAT . का उपयोग करके . यदि सत्र का NLS_TIMESTAMP_FORMAT . है आपके to_date में स्पष्ट प्रारूप मास्क से मेल नहीं खाता कॉल करें, तो आपको एक त्रुटि मिलेगी या रूपांतरण एक ऐसा परिणाम देगा जिसकी आपको अपेक्षा नहीं है।

यदि आपकी तालिका का कॉलम वास्तव में date . प्रकार का है , आप सीधे date . की तुलना कर सकते हैं एक timestamp . के लिए . इसलिए to_date . पर कॉल करने का कोई कारण नहीं दिखता है यहां। हालांकि, आपके नमूना डेटा के आधार पर, ऐसा प्रतीत होता है कि आपकी तालिका का स्तंभ वास्तव में timestamp प्रकार का है date . के बजाय जैसा कि आपके कोड का तात्पर्य है, date . के बाद से परिशुद्धता के भिन्नात्मक सेकंड नहीं हैं। अगर ऐसा है, तो to_date . पर कॉल करने का कोई मतलब नहीं है अपने SELECT . में कथन क्योंकि आपके पैरामीटर वास्तव में timestamp . प्रकार के हैं और आपका कॉलम timestamp . प्रकार का है . बस timestamp की तुलना करें मान।

इसलिए, मेरा अनुमान है कि आप कुछ ऐसा चाहते हैं

CREATE OR REPLACE PROCEDURE PROC1(
   V_STARTTIME    IN TIMESTAMP ,
   V_ENDTIME      IN TIMESTAMP )
BEGIN
  INSERT INTO TAB1( <<column name>> )
    SELECT COINS 
      FROM TAB2
     WHERE <<timestamp column name>> BETWEEN v_starttime AND v_endtime;
END;

और आप वास्तविक टाइमस्टैम्प पास करके प्रक्रिया को शांत करना चाहते हैं। टाइमस्टैम्प अक्षर का उपयोग करना

Execute proc1(timestamp '2014-05-05 11:25:00', timestamp '2014-05-05 12:25:00' )

या स्पष्ट रूप से to_timestamp . पर कॉल करके

execute proc1( to_timestamp( '5/05/2014 11:25:00 AM', 'MM/DD/YYYY HH:MI:SS AM' ),
               to_timestamp( '5/05/2014 12:25:00 PM', 'MM/DD/YYYY HH:MI:SS AM' ) );

इससे उन सभी निहित प्रकार के रूपांतरणों से छुटकारा मिल जाएगा जो वर्तमान में हो रहे हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. केवल उन अभिलेखों को कैसे प्रारूपित करें जिनके लिए ORA-01843 फेंका नहीं गया है?

  2. Oracle - केवल पढ़ने के लिए उपयोगकर्ता कैसे बनाएं

  3. Oracle पर AUTO_INCREMENT के साथ आईडी कैसे बनाएं?

  4. किसी भी स्तंभ के विरुद्ध एक तालिका से सामान्य पंक्तियाँ प्राप्त करें

  5. Oracle में संयोजित तार उत्पन्न करने का तेज़ तरीका