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

जब पैरामीटर दर्ज नहीं किया जाता है, तो उस खंड में दिनांक सीमा पैरामीटर पर ध्यान न दें

वैकल्पिक इनपुट पैरामीटर्स तक पहुंचने के लिए आपके पास दो संभावनाएं हैं।

सरल तरीका है स्थिर SQL का उपयोग करना और डिफ़ॉल्ट providing प्रदान करना अनुपलब्ध पैरामीटर के लिए मान, ताकि आपको सभी मिलान मिलें।

यहां आप सरलता से न्यूनतम और अधिकतम संभव DATE की सीमाएँ निर्धारित करते हैं।

select * 
from customer
where customer_id = $P{CLIENT_ID}
and datetrx between nvl($P{DATE_START},date'1900-01-01') 
                and nvl($P{DATE_END},date'2200-01-01')

जितना अधिक उन्नत रास्ता टॉम कायटे द्वारा लोकप्रिय किया गया था और यह गतिशील एसक्यूएल का उपयोग करने पर आधारित है।

अगर पैरामीटर दिए गए हैं , आप सामान्य SQL को BETWEEN . के साथ जेनरेट करते हैं विधेय :

select * 
from customer
where customer_id = $P{CLIENT_ID}
and datetrx between $P{DATE_START} and $P{DATE_END}

मामले में पैरामीटर गायब हैं (यानी NULL पास हो गया है) आप एक भिन्न SQL उत्पन्न करते हैं जैसा कि नीचे दिखाया गया है।

select * 
from customer
where customer_id = $P{CLIENT_ID}
and (1=1 or datetrx between $P{DATE_START} and $P{DATE_END})

ध्यान दें, कि

1) क्वेरी के दोनों प्रकारों में बाइंड वैरिएबल की संख्या समान है, जो महत्वपूर्ण है क्योंकि आप समान setXXXX का उपयोग कर सकते हैं बयान

2) शॉर्टकट . के कारण 1 = 1 or between है विधेय पर ध्यान नहीं दिया, यानी सभी तिथियों पर विचार किया जाता है।

किस विकल्प का उपयोग किया जाना चाहिए?

वैसे सरल प्रश्नों के लिए थोड़ा अंतर होगा, लेकिन लापता पैरामीटर और बड़े डेटा के कई विकल्पों के साथ जटिल प्रश्नों के लिए, गतिशील SQL दृष्टिकोण को प्राथमिकता दी जाती है

इसका कारण यह है कि स्थिर एसक्यूएल का उपयोग करके आप एक ही कथन का उपयोग अधिक भिन्न प्रश्नों के लिए करते हैं - यहां एक के साथ तक पहुंच के लिए है। डेटा श्रेणी और एक पहुंच के लिए बिना डेटा रेंज।

डायनेमिक विकल्प प्रत्येक एक्सेस के लिए अलग SQL उत्पन्न करता है।

आप इसे निष्पादन योजनाओं पर देख सकते हैं:

तारीख सीमा के साथ पहुंच

-------------------------------------------------------------------------------
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |           |     1 |    22 |     1   (0)| 00:00:01 |
|*  1 |  FILTER           |           |       |       |            |          |
|*  2 |   INDEX RANGE SCAN| CUST_IDX1 |     1 |    22 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(TO_DATE(:1)<=TO_DATE(:2))
   2 - access("CUSTOMER_ID"=1 AND "DATETRX">=:1 AND "DATETRX"<=:2)

डेटा श्रेणी के बिना पहुंच

------------------------------------------------------------------------------
| Id  | Operation        | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |           |     1 |    22 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| CUST_IDX1 |     1 |    22 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("CUSTOMER_ID"=1)

दोनों कथन अलग-अलग निष्पादन योजना तैयार करते हैं, जो इनपुट पैरामीटर के लिए अनुकूलित है। स्थिर विकल्प में उपयोग समान निष्पादन योजना को साझा करना चाहिए सभी इनपुट के लिए जो समस्याएँ पैदा कर सकते हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरेकल में सक्रिय/खुले कनेक्शन कैसे सूचीबद्ध करें?

  2. ORA-29285 कैसे हल करें:फ़ाइल लिखने में त्रुटि

  3. चरण-दर-चरण अपग्रेड प्रक्रिया R12.2 में अपग्रेड करें भाग -3

  4. 1985-02-07T00:00:00.000Z (ISO8601) को Oracle में दिनांक मान में कैसे बदलें?

  5. एजेंट अवरुद्ध है