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