बाइंड वैरिएबल का इस्तेमाल करें
SQL> create or replace procedure proc( p_dt in date )
2 as
3 begin
4 dbms_output.put_line( to_char( p_dt, 'yyyy-mm-dd hh24:mi:ss' ));
5 end;
6 /
Procedure created.
SQL> declare
2 l_sql varchar2(1000);
3 begin
4 l_sql := 'begin proc(:dt); end;';
5 execute immediate l_sql using sysdate;
6 end;
7 /
2013-08-26 22:14:26
PL/SQL procedure successfully completed.
आपके कोड के साथ समस्या यह है कि आपकी स्ट्रिंग बनाने के लिए, Oracle को DATE
. को कनवर्ट करना होगा एक VARCHAR2
. के लिए . यह आपके सत्र के NLS_DATE_FORMAT
. का उपयोग करके ऐसा करता है . लेकिन आपके सत्र का NLS_DATE_FORMAT
शायद समय घटक शामिल नहीं है, इसलिए जब आपकी प्रक्रिया को वास्तव में बुलाया जाता है तो समय खो जाता है। बाइंड वेरिएबल्स का उपयोग करने का मतलब है कि आपको उस तरह के निहित रूपांतरण से निपटने की ज़रूरत नहीं है (यह अधिक कुशल और अधिक सुरक्षित भी है)।
यदि आप वास्तव में बाइंड वैरिएबल के उपयोग से बचना चाहते हैं, तो आप स्पष्ट रूप से sysdate
. कास्ट कर सकते हैं एक to_char
. का उपयोग करके एक स्ट्रिंग के लिए और फिर एक to_date
डालें गतिशील प्रक्रिया कॉल में। लेकिन यह बहुत सारे अतिरिक्त कोड और कई अनावश्यक रूपांतरण हैं।
SQL> ed
Wrote file afiedt.buf
1 declare
2 l_sql varchar2(1000);
3 begin
4 l_sql := q'{begin proc(to_date('}' ||
5 to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') ||
6 q'{', 'yyyy-mm-dd hh24:mi:ss')); end;}';
7 execute immediate l_sql;
8* end;
SQL> /
2013-08-26 22:19:52
PL/SQL procedure successfully completed.