चेतावनी :इस तरह गतिशील एसक्यूएल एसक्यूएल इंजेक्शन हमलों के लिए अतिसंवेदनशील है। इसके बजाय बाइंड वैरिएबल का उपयोग करने के लिए जहां भी संभव हो अपने डायनेमिक SQL को फिर से लिखें।
अपने डायनामिक SQL को इस तरह बनाने के बजाय:
L_SQL := 'UPDATE '||l_prefix||'CRS_CUSTOMERS SET CUSTOMER_SOURCE_REF_ID = '||i.CUSTOMER_REF_ID||' WHERE CUSTOMER_ID = '||i.CUSTOMER_ID;
EXECUTE IMMEDIATE L_SQL;
इसका इस्तेमाल करें:
L_SQL := 'UPDATE '||l_prefix||'CRS_CUSTOMERS SET CUSTOMER_SOURCE_REF_ID = :REF_ID WHERE CUSTOMER_ID = :CUST_ID';
EXECUTE IMMEDIATE L_SQL USING i.CUSTOMER_REF_ID, i.CUSTOMER_ID;
यह अभी भी l_prefix
. पर SQL इंजेक्शन के अधीन है , लेकिन यदि आप उस मान को प्रोग्रामिक रूप से नियंत्रित करते हैं तो यह ठीक हो सकता है। साथ ही SQL के निर्माण और SQL के निष्पादन को दो चरणों में विभाजित करने से आप EXECUTE IMMEDIATE
को अधिक आसानी से बदल सकते हैं DBMS_OUTPUT.PUT_LINE(SQL);
. के साथ सिंटैक्स त्रुटियों के लिए अपनी क्वेरी की जाँच करने के लिए। आप DBMS_OUTPUT.PUT_LINE
भी चाह सकते हैं आपके पैरामीटर i.CUSTOMER_REF_ID
और i.CUSTOMER_ID
उनके मूल्यों की जाँच करने के लिए।