2009-01-28 9 views
7

के साथ पेजिंग मैं एक ग्रिडव्यू में या एक HTML तालिका में पेजिंग को कार्यान्वित करना चाहता हूं जिसे मैं AJAX का उपयोग करके भर दूंगा। पेजिंग का समर्थन करने के लिए मुझे प्रश्न कैसे लिखना चाहिए? उदाहरण के लिए यदि पेजसाइज 20 है और जब उपयोगकर्ता पेज 3 पर क्लिक करता है, तो 41 और 60 के बीच पंक्तियों को तालिका पर दिखाया जाना चाहिए। सबसे पहले मैं सभी रिकॉर्ड प्राप्त कर सकता हूं और उन्हें कैश में डाल सकता हूं लेकिन मुझे लगता है कि यह गलत तरीका है। चूंकि डेटा बहुत बड़ा हो सकता है और डेटा अन्य सत्रों से बदला जा सकता है। तो मैं इसे कैसे कार्यान्वित कर सकता हूं? क्या कोई सामान्य तरीका है (सभी डेटाबेस के लिए)?ओरेकल और एसक्यूएल सर्वर और जेनेरिक पेजिंग विधि

उत्तर

4

दुर्भाग्यवश, एक क्वेरी द्वारा लौटाई गई पंक्तियों की सीमा को सीमित करने के तरीके एक डीबीएमएस से दूसरे में भिन्न होते हैं: ओरेकल ROWNUM का उपयोग करता है (ocdecio का उत्तर देखें), लेकिन ROWNUM SQL सर्वर में काम नहीं करेगा।

sql = paginated ('select empno, ename from emp where job = ?', 101, 150) 

जो वापसी होगी: यानी कुछ की तरह -

शायद आप एक समारोह है कि किसी भी एसक्यूएल बयान और पहली और आखिरी पंक्ति संख्या लेता है और लक्ष्य डीबीएमएस के लिए उपयुक्त paginatd एसक्यूएल उत्पन्न करता है के साथ इन मतभेदों को संपुटित कर सकते हैं

'select * from (select v.*, ROWNUM rn from (' 
+ theSql 
+ ') v where rownum < 150) where rn >= 101' 

ओरेकल के लिए और SQL सर्वर के लिए कुछ और।

हालांकि, ध्यान दें कि ओरेकल समाधान उन परिणामों के लिए एक नया कॉलम आरएन जोड़ रहा है जिनके साथ आपको निपटने की आवश्यकता होगी।

1

मुझे विश्वास है कि दोनों में ROWNUM विश्लेषणात्मक फ़ंक्शन है। इसका प्रयोग करें और आप समान होंगे।

ओरेकल में यह here

ROW_NUMBER

हाँ, बस सत्यापित है कि ROW_NUMBER दोनों में एक ही समारोह है।

0

यदि अपेक्षित डेटा सेट बहुत बड़ा है, तो मैं क्वेरी परिणामों को संग्रहीत करने के लिए एक temp तालिका, दृश्य या स्नैपशॉट (भौतिक दृश्य) बनाने की अनुशंसा करता हूं + ROWNUM या ROW_NUMBER विश्लेषणात्मक फ़ंक्शन का उपयोग करके या तो पंक्ति संख्या पुनर्प्राप्त की जाती है। उसके बाद आप पंक्ति संख्या श्रेणियों का उपयोग करके बस इस अस्थायी संग्रहण से पूछ सकते हैं। असल में, आपको पेजिंग से वास्तविक डेटा लाने को अलग करने की आवश्यकता है।

1

"क्योंकि ... डेटा अन्य सत्रों से बदला जा सकता है।" इसके लिए आप क्या करना चाहते हैं?

उदाहरण के लिए, उपयोगकर्ता को 10:30 पर 'नवीनतम' दस पंक्तियां मिलती हैं।

10:31 पर, 3 नई पंक्तियों को जोड़ा जाता है (इसलिए उपयोगकर्ता द्वारा देखे जाने वाले दस लोग अब नवीनतम नहीं हैं)।

10:32 पर, उपयोगकर्ता तब 'अगली' दस प्रविष्टियों का अनुरोध करता है।

क्या आप चाहते हैं कि वह नया सेट उन तीनों को शामिल करे जो 8/9/10 से 11/12/13 तक बंप किए गए हैं? यदि नहीं, Oracle में आप डेटा के रूप में यह 10:30

SELECT * FROM table_1 as of timestamp (timestamp '2009-01-29 10:30:00'); 

तुम अब भी ROW_NUMBER तर्क की जरूरत पर था चुन सकते हैं, जैसे

select * from 
    (SELECT a.*, row_number() over (order by hire_date) rn 
    FROM hr.employees as of timestamp (timestamp '2009-01-29 10:30:00') a) 
where rn between 10 and 19 
+0

अन्य विकल्प वास्तव में शुरुआत में 100 पंक्तियां लेते हैं लेकिन केवल एक समय में 10 दिखाते हैं। जावास्क्रिप्ट को केवल तालिका पंक्तियों को छिपाना/प्रकट करना है। यह उन उपयोगकर्ताओं पर गिना जाता है जो कभी दस गुना से अधिक पेज नहीं करना चाहते हैं। –

0

विभिन्न भर में पेजिंग सुनिश्चित करने का कोई तरीका नहीं है वर्दी आरडीबीएमएस उत्पादों।

where rownum < 1000 

एसक्यूएल सर्वर आप row_id() फ़ंक्शन जो Oracle की ROWNUM के लिए इसी तरह इस्तेमाल किया जा सकता देता है: ओरेकल आप ROWNUM जहां खंड की तरह है जो आप में उपयोग कर सकते हैं देता है। हालांकि, row_id() SQL Server 2005 से पहले उपलब्ध नहीं है।

17

जैसा कि अन्य ने सुझाव दिया है, आप ओरेकल में राउनम का उपयोग कर सकते हैं। हालांकि यह थोड़ा मुश्किल है और आपको अपनी क्वेरी दो बार घोंसला करना है।

उदाहरण के लिए, क्वेरी पृष्ठ पर अंक लगाना करने के लिए

select first_name from some_table order by first_name 

आप इस

select first_name from 
    (select rownum as rn, first_name from 
    (select first_name from some_table order by first_name) 
) where rn > 100 and rn <= 200 

इस का कारण यह की तरह घोंसला यह करने की जरूरत है कि ROWNUM जहां खंड और से पहले के बाद निर्धारित होता है खंड द्वारा आदेश। मैं क्या मतलब है देखने के लिए, आप

select rownum,first_name from some_table order by first_name 

क्वेरी कर सकता है और क्योंकि ओरेकल का मूल्यांकन करता है, जहां खंड (इस मामले में कोई नहीं) आप

4 Diane 
2 Norm 
3 Sam 
1 Woody 

है कि मिल सकता है, तो rownums प्रदान करती है, तब तक परिणाम सॉर्ट करता पहला नाम। आपको क्वेरी को घोंसला करना होगा ताकि के बाद पंक्तियों को क्रमबद्ध करने के बाद असाइन किए गए राउनम का उपयोग किया जाए।

दूसरे घोंसले को यह करना है कि किस स्थिति में रोउनम का इलाज किया जाता है। असल में, यदि आप "जहां rownum> 100" पूछते हैं तो आपको कोई परिणाम नहीं मिलता है। यह एक चिकन और अंडा चीज है जहां यह किसी भी पंक्ति को वापस नहीं कर सकता है जब तक कि यह राउनम> 100 नहीं पाता है, लेकिन चूंकि यह किसी भी पंक्ति को वापस नहीं कर रहा है, यह कभी भी रोउनम में वृद्धि नहीं करता है, इसलिए यह 100 की गणना नहीं करता है। उह। घोंसले का दूसरा स्तर यह हल करता है। ध्यान दें कि इस बिंदु पर इसे राउनम कॉलम उपनाम करना चाहिए।

अंत में, खंड द्वारा आपके आदेश को क्वेरी निर्धारक बनाना चाहिए। उदाहरण के लिए, यदि आपके पास जॉन डो और जॉन स्मिथ है, और आप केवल पहले नाम से ऑर्डर करते हैं, तो दोनों क्वेरी के निष्पादन से अगले स्थान पर स्थानांतरित कर सकते हैं।

यहां लेख हैं http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html और यहां http://www.oracle.com/technology/oramag/oracle/07-jan/o17asktom.html। अब मुझे लगता है कि कितनी देर तक मेरी पोस्ट है, मैं शायद सिर्फ होना चाहिए उन लिंक्स तैनात ...

1
select * 
    from (select /*+ FIRST_ROWS(n) */ a.*, 
     ROWNUM rnum 
     from (your_query_goes_here, 
     with order by) a 
     where ROWNUM <= 
     :MAX_ROW_TO_FETCH) 
where rnum >= :MIN_ROW_TO_FETCH; 

चरण 1: select a.*, ROWNUM rnum from()a where ROWNUM <=:MAX_ROW_TO_FETCH

चरण 3: द्वारा

चरण 2 आदेश के साथ आपकी क्वेरी : select * from () where rnum >= :MIN_ROW_TO_FETCH; 3 में 2 और 2 में 2

संबंधित मुद्दे