खोज…


परिचय

गतिशील SQL आपको रनटाइम में SQL क्वेरी कोड को इकट्ठा करने की अनुमति देता है। इस तकनीक के कुछ नुकसान हैं और इन्हें बहुत सावधानी से इस्तेमाल किया जाना है। उसी समय, यह आपको अधिक जटिल तर्क को लागू करने की अनुमति देता है। पीएल / एसक्यूएल की आवश्यकता है कि कोड में उपयोग की जाने वाली सभी वस्तुओं का अस्तित्व और संकलन समय पर मान्य होना चाहिए। इसलिए आप PL / SQL में DDL स्टेटमेंट को सीधे निष्पादित नहीं कर सकते, लेकिन डायनेमिक SQL आपको ऐसा करने की अनुमति देता है।

टिप्पणियों

कुछ महत्वपूर्ण टिप्पणियां:

  1. मानों को क्वेरी में जोड़ने के लिए, स्ट्रिंग मापदंडों का उपयोग कभी न करें, इसके बजाय मापदंडों का उपयोग करें। ये गलत है:

    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;
    

    दूसरा कारण प्रदर्शन है। ओरेकल मापदंडों के बिना हर बार क्वेरी करेगा जब यह निष्पादित होता है, जबकि पैरामीटर के साथ क्वेरी सत्र में केवल एक बार पार्स की जाएगी।

  2. ध्यान दें, कि जब डेटाबेस इंजन 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;
/


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow