Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

तत्काल तत्काल का उपयोग करते हुए डायनामिक एसक्यूएल सिंटैक्स

चेतावनी :इस तरह गतिशील एसक्यूएल एसक्यूएल इंजेक्शन हमलों के लिए अतिसंवेदनशील है। इसके बजाय बाइंड वैरिएबल का उपयोग करने के लिए जहां भी संभव हो अपने डायनेमिक 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 उनके मूल्यों की जाँच करने के लिए।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:दो तालिकाओं को विभिन्न स्तंभों के साथ संयोजित करें

  2. सी # में ओरेकल टाइमस्टैम्प को पार्स करने में असमर्थ

  3. Oracle रैंडम नंबर जेनरेटर DBMS_RANDOM का उपयोग किए बिना संग्रहीत प्रक्रिया

  4. कोई रिकॉर्ड न होने पर SUM का चयन करें एक पंक्ति लौटाता है

  5. ट्रिगर में त्रुटि संदेश खराब बाइंड वैरिएबल