Oracle Database
गतिशील एसक्यूएल
खोज…
परिचय
गतिशील SQL आपको रनटाइम में SQL क्वेरी कोड को इकट्ठा करने की अनुमति देता है। इस तकनीक के कुछ नुकसान हैं और इन्हें बहुत सावधानी से इस्तेमाल किया जाना है। उसी समय, यह आपको अधिक जटिल तर्क को लागू करने की अनुमति देता है। पीएल / एसक्यूएल की आवश्यकता है कि कोड में उपयोग की जाने वाली सभी वस्तुओं का अस्तित्व और संकलन समय पर मान्य होना चाहिए। इसलिए आप PL / SQL में DDL स्टेटमेंट को सीधे निष्पादित नहीं कर सकते, लेकिन डायनेमिक SQL आपको ऐसा करने की अनुमति देता है।
टिप्पणियों
कुछ महत्वपूर्ण टिप्पणियां:
मानों को क्वेरी में जोड़ने के लिए, स्ट्रिंग मापदंडों का उपयोग कभी न करें, इसके बजाय मापदंडों का उपयोग करें। ये गलत है:
execute immediate 'select value from my_table where id = ' || id_valiable into result_variable;
और यह सही है:
execute immediate 'select value from my_table where id = :P ' using id_valiable into result_variable;
इसके लिए दो कारण हैं। पहली सुरक्षा है। स्ट्रिंग संघनन SQL इंजेक्शन बनाने की अनुमति देता है। नीचे दी गई क्वेरी में, यदि किसी चर में मान
1 or 1 = 1
, तोUPDATE
विवरण तालिका में सभी पंक्तियों को अद्यतन करेगा:execute immediate 'update my_table set value = ''I have bad news for you'' where id = ' || id;
दूसरा कारण प्रदर्शन है। ओरेकल मापदंडों के बिना हर बार क्वेरी करेगा जब यह निष्पादित होता है, जबकि पैरामीटर के साथ क्वेरी सत्र में केवल एक बार पार्स की जाएगी।
ध्यान दें, कि जब डेटाबेस इंजन DDL स्टेटमेंट निष्पादित करता है, तो यह पहले निहित प्रतिबद्ध निष्पादित करता है।
डायनेमिक SQL के साथ मान का चयन करें
मान लीजिए कि कोई उपयोगकर्ता विभिन्न तालिकाओं से डेटा का चयन करना चाहता है। एक तालिका उपयोगकर्ता द्वारा निर्दिष्ट की जाती है।
function get_value(p_table_name varchar2, p_id number) return varchar2 is
value varchar2(100);
begin
execute immediate 'select column_value from ' || p_table_name ||
' where id = :P' into value using p_id;
return value;
end;
इस फ़ंक्शन को हमेशा की तरह कॉल करें:
declare
table_name varchar2(30) := 'my_table';
id number := 1;
begin
dbms_output.put_line(get_value(table_name, id));
end;
परीक्षण करने के लिए तालिका:
create table my_table (id number, column_value varchar2(100));
insert into my_table values (1, 'Hello, world!');
डायनामिक SQL में मान डालें
पिछले उदाहरण से तालिका में आवेषण मूल्य के नीचे का उदाहरण:
declare
query_text varchar2(1000) := 'insert into my_table(id, column_value) values (:P_ID, :P_VAL)';
id number := 2;
value varchar2(100) := 'Bonjour!';
begin
execute immediate query_text using id, value;
end;
/
गतिशील SQL में मानों को अपडेट करें
पहले उदाहरण से तालिका अपडेट करें:
declare
query_text varchar2(1000) := 'update my_table set column_value = :P_VAL where id = :P_ID';
id number := 2;
value varchar2(100) := 'Bonjour le monde!';
begin
execute immediate query_text using value, id;
end;
/
डीडीएल कथन निष्पादित करें
यह कोड तालिका बनाता है:
begin
execute immediate 'create table my_table (id number, column_value varchar2(100))';
end;
/
अनाम ब्लॉक को निष्पादित करें
आप अनाम ब्लॉक निष्पादित कर सकते हैं। यह उदाहरण दिखाता है कि डायनेमिक SQL से मान कैसे लौटाया जाए:
declare
query_text varchar2(1000) := 'begin :P_OUT := cos(:P_IN); end;';
in_value number := 0;
out_value number;
begin
execute immediate query_text using out out_value, in in_value;
dbms_output.put_line('Result of anonymous block: ' || to_char(out_value));
end;
/