रेफरी कर्सर, सशर्त संकलन का उपयोग करके आलसी मूल्यांकन (आंशिक रूप से) कार्यान्वित किया जा सकता है, या तत्काल निष्पादित किया जा सकता है। ANYDATA प्रकार का उपयोग जेनेरिक डेटा पास करने के लिए किया जा सकता है।
रेफ कर्सर
रेफरी कर्सर को एक स्थिर SQL कथन के साथ खोला जा सकता है, तर्क के रूप में पारित किया जाता है, और जब तक आवश्यक नहीं होगा तब तक निष्पादित नहीं होगा।
हालांकि यह सचमुच आलसी मूल्यांकन के बारे में आपके प्रश्न का उत्तर देता है, मुझे यकीन नहीं है कि यह वास्तव में व्यावहारिक है या नहीं। यह रेफ कर्सर का इच्छित उपयोग नहीं है। और एसक्यूएल को हर चीज में जोड़ना सुविधाजनक नहीं हो सकता है।
सबसे पहले, यह साबित करने के लिए कि धीमा कार्य चल रहा है, एक ऐसा फ़ंक्शन बनाएं जो बस कुछ सेकंड के लिए सो जाए:
grant execute on sys.dbms_lock to <your_user>;
create or replace function sleep(seconds number) return number is
begin
dbms_lock.sleep(seconds);
return 1;
end;
/
मूल्यांकन आवश्यक है या नहीं यह निर्धारित करने के लिए एक फ़ंक्शन बनाएं:
create or replace function do_i_have_to_trace return boolean is
begin
return true;
end;
/
यह फ़ंक्शन SQL कथन को निष्पादित करके कार्य कर सकता है। SQL कथन को कुछ लौटाना चाहिए, भले ही आप वापसी मान नहीं चाहते हों।
create or replace procedure trace_something(p_cursor sys_refcursor) is
v_dummy varchar2(1);
begin
if do_i_have_to_trace then
fetch p_cursor into v_dummy;
end if;
end;
/
अब ऐसी प्रक्रिया बनाएं जो हमेशा ट्रेस को कॉल करे लेकिन जरूरी नहीं कि तर्कों का मूल्यांकन करने में समय बिताए।
create or replace procedure lazily_trace_something(some_number in number) is
v_cursor sys_refcursor;
begin
open v_cursor for select sleep(some_number) from dual;
trace_something(v_cursor);
end;
/
डिफ़ॉल्ट रूप से यह काम कर रहा है और धीमा है:
--Takes 2 seconds to run:
begin
lazily_trace_something(2);
end;
/
लेकिन जब आप DO_I_HAVE_TO_TRACE
बदलते हैं झूठी वापसी के लिए प्रक्रिया तेज है, भले ही यह धीमी तर्क से गुजर रही हो।
create or replace function do_i_have_to_trace return boolean is
begin
return false;
end;
/
--Runs in 0 seconds.
begin
lazily_trace_something(2);
end;
/
अन्य विकल्प
सशर्त संकलन अधिक परंपरागत रूप से इंस्ट्रूमेंटेशन को सक्षम या अक्षम करने के लिए उपयोग किया जाता है। उदाहरण के लिए:
create or replace package constants is
c_is_trace_enabled constant boolean := false;
end;
/
declare
v_dummy number;
begin
$if constants.c_is_trace_enabled $then
v_dummy := sleep(1);
This line of code does not even need to be valid!
(Until you change the constant anyway)
$else
null;
$end
end;
/
आप डायनेमिक SQL पर फिर से विचार करना चाह सकते हैं। प्रोग्रामिंग शैली और कुछ वाक्यात्मक चीनी यहाँ एक बड़ा बदलाव ला सकते हैं। संक्षेप में, वैकल्पिक कोट सिंटैक्स और सरल टेम्पलेट डायनेमिक SQL को और अधिक पठनीय बना सकते हैं। अधिक जानकारी के लिए मेरी पोस्ट यहां ।
सामान्य डेटा पास करना
किसी भी कल्पनीय डेटा प्रकार को स्टोर और पास करने के लिए किसी भी प्रकार का उपयोग किया जा सकता है। दुर्भाग्य से प्रत्येक पंक्ति प्रकार के लिए कोई मूल डेटा प्रकार नहीं है। आपको प्रत्येक तालिका के लिए एक प्रकार बनाना होगा। वे कस्टम प्रकार बहुत सरल हैं ताकि यदि आवश्यक हो तो चरण को स्वचालित किया जा सके।
create table some_table(a number, b number);
create or replace type some_table_type is object(a number, b number);
declare
a_rowtype_variable some_table_type;
v_anydata anydata;
v_cursor sys_refcursor;
begin
a_rowtype_variable := some_table_type(1,2);
v_anydata := anydata.ConvertObject(a_rowtype_variable);
open v_cursor for select v_anydata from dual;
trace_something(v_cursor);
end;
/