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

Oracle PL\SQL अशक्त इनपुट पैरामीटर WHERE स्थिति

एक तरीका यह होगा कि

. के एक प्रकार का उपयोग किया जाए
 WHERE column = nvl(var, column)

हालांकि यहां दो नुकसान हैं:

  1. यदि कॉलम शून्य है, तो यह खंड शून्य मानों को फ़िल्टर करेगा जबकि आपके प्रश्न में आप दूसरे मामले में शून्य मानों को फ़िल्टर नहीं करेंगे। आप नल को ध्यान में रखने के लिए इस खंड को संशोधित कर सकते हैं लेकिन यह बदसूरत हो जाता है:

        WHERE nvl(column, impossible_value) = nvl(var, impossible_value)
    

    बेशक अगर किसी तरह impossible_value कभी भी डाला जाता है तो आप किसी अन्य प्रकार की (मज़ेदार) समस्याओं में भाग लेंगे।

  2. अनुकूलक इस प्रकार के खंड को ठीक से नहीं समझता है। यह कभी-कभी UNION ALL के साथ एक योजना तैयार करेगा लेकिन यदि कुछ nvl से अधिक हैं , पूर्ण रूप से मान्य अनुक्रमणिका मौजूद होने पर भी आपको पूर्ण स्कैन प्राप्त होगा।

यही कारण है कि जब बहुत सारे पैरामीटर होते हैं (उदाहरण के लिए बड़े रूप में कई खोज फ़ील्ड), मैं गतिशील एसक्यूएल का उपयोग करना पसंद करता हूं:

DECLARE
   l_query VARCHAR2(32767) := 'SELECT ... JOIN ... WHERE 1 = 1';
BEGIN
   IF param1 IS NOT NULL THEN
      l_query := l_query || ' AND column1 = :p1';
   ELSE 
      l_query := l_query || ' AND :p1 IS NULL';
   END IF;
   /* repeat for each parameter */
   ...
   /* open the cursor dynamically */
   OPEN your_ref_cursor FOR l_query USING param1 /*,param2...*/; 
END;

आप EXECUTE IMMEDIATE l_query INTO l_result USING param1; का भी उपयोग कर सकते हैं



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC का उपयोग करके Oracle 11g के साथ अंतिम सम्मिलित आईडी प्राप्त करें

  2. क्या पैकेज/प्रक्रिया के बाहर Oracle सहयोगी सरणी प्रकार बनाना संभव है?

  3. ओरेकल रिपोर्ट बिल्डर में पेज की चौड़ाई बढ़ाना

  4. Oracle DELETE प्रदर्शन को बेहतर बनाने की रणनीति

  5. विशालब्लॉब डेटा को कैसे क्वेरी करें