2009-10-29 23 views
6

मैं एक PL/SQL VArray है कि मैं एक बल्क के साथ भरने कर रहा हूँ इस तरह क्वेरी इकट्ठा मिल गया है:क्या मैं एक पीएल/एसक्यूएल संग्रह टुकड़ा कर सकता हूं?

SELECT id 
BULK COLLECT INTO myarray 
FROM aTable 

अब मैं, कुछ इस तरह एक और संग्रह में इस संग्रह का एक टुकड़ा पारित करने के लिए करना चाहते हैं :

newarray := myarray(2..5) 

यह तत्वों को 2,3,4 और 5 को माइएरे से न्यूएरे में पास करना चाहिए।

मैं एक लूप लिख सकता हूं और तत्वों की प्रतिलिपि बना सकता हूं, लेकिन क्या ऐसा करने के लिए एक और अधिक कॉम्पैक्ट तरीका है?

+0

अच्छा विचार, लेकिन मुझे एक लूप से कोई छोटा नहीं मिला। – Christian13467

+0

आप इसे और अधिक चुनिंदा चयन के बजाय क्यों करना चाहते हैं? – David

+0

क्योंकि मैं एक निश्चित स्थिति का सबसे बड़ा "टुकड़ा" निर्धारित करना चाहता हूं। चेक कोड के एक अधिक जटिल हिस्से में है, और मैं इसे छोटे और छोटे स्लाइस के साथ बुलाता हूं। – Thorsten

उत्तर

3

आम तौर पर, आप यह नहीं करना चाहते हैं। आपके पास स्मृति में एक बड़ा संग्रह है, और अब आप इसकी एक प्रति बनाना चाहते हैं। यह और स्मृति का भी उपयोग करेगा। आम तौर पर इस तरह के मामलों में आप पूरे संग्रह को पास करते हैं (संदर्भ के अनुसार, मूल्य नहीं) और एक स्टार्ट और स्टॉप इंडेक्स भी प्रदान करते हैं। निर्दिष्ट सीमा को संसाधित करने के लिए इसे अन्य कार्यों में छोड़ दें।

+0

ठीक है, मेरे विशिष्ट उपयोग के मामले में मुझे वास्तव में कोई समस्या नहीं दिखाई दे रही है क्योंकि मैं अधिकतर छोटे संग्रहों से निपट रहा हूं (<10 प्रविष्टियां - मैंने अपनी क्वेरी में कहां मानदंड छोड़ा)। कॉपी करने की छोटी मेमोरी/रनटाइम ओवरहेड मुझे कोड जटिलता से छोटा लगता है जो इसे पेश करेगा। – Thorsten

+0

+1, पीएल/एसक्यूएल सी नहीं है - कोई पॉइंटर्स नहीं। – DCookie

+1

बिल्कुल पॉइंटर्स नहीं, लेकिन आप एक पैरामीटर पर 'NOCOPY' संकेत पर कर सकते हैं। देखें http://www.dba-oracle.com/t_plsql_passing_data_structures_nocopy.htm –

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