2009-10-29 9 views
6

Tengo un PL/SQL VARRAY que estoy llenando con un granel Tomar consulta como esta:¿Puedo cortar una colección PL/SQL?

SELECT id 
BULK COLLECT INTO myarray 
FROM aTable 

Ahora me gustaría pasar una rebanada de esta colección a otra colección, algo como esto :

newarray := myarray(2..5) 

Esto debería pasar los elementos 2,3,4 y 5 de myarray a newarray.

Podría escribir un ciclo y copiar los elementos, pero ¿hay alguna forma más compacta de hacerlo?

+0

Buena idea, pero no encontré ninguna más corta que un bucle. – Christian13467

+0

¿Por qué querrías hacer esto en lugar de otra selección más selectiva? – David

+0

Porque quiero determinar la "porción" más grande de una determinada condición. El cheque está en una parte más complicada del código, y lo llamo con porciones cada vez más pequeñas. – Thorsten

Respuesta

3

Generalmente, no desea hacer esto. Tienes una gran colección en la memoria y ahora quieres hacer una copia de ella. Eso usaría incluso más de memoria. Por lo general, en casos como este, pasa toda la colección (por referencia, no valor) y también proporciona un índice de inicio y detención. Deja que las otras funciones solo procesen el rango especificado.

+0

Bueno, para mi caso de uso específico, realmente no veo un problema ya que trataré principalmente con colecciones bastante pequeñas (<10 entradas: omití los criterios de dónde en mi consulta). La pequeña sobrecarga de memoria/tiempo de ejecución de hacer la copia me parece más pequeña que la complejidad del código que introduciría. – Thorsten

+0

+1, PL/SQL no es C - sin punteros. – DCookie

+1

No punteros exactamente, pero se puede en una pista 'NOCOPY' en un parámetro. Ver http://www.dba-oracle.com/t_plsql_passing_data_structures_nocopy.htm –