2009-10-29 32 views
6

Tôi đã có một PL/SQL VArray rằng tôi đang làm đầy với một số lượng lớn COLLECT truy vấn như thế này:Tôi có thể chia bộ sưu tập PL/SQL không?

SELECT id 
BULK COLLECT INTO myarray 
FROM aTable 

Bây giờ tôi muốn vượt qua một lát bộ sưu tập này vào bộ sưu tập khác, một cái gì đó như thế này :

newarray := myarray(2..5) 

Điều này sẽ chuyển các phần tử 2,3,4 và 5 từ myarray đến newarray.

Tôi có thể viết một vòng lặp và sao chép các phần tử, nhưng có cách nào nhỏ gọn hơn để thực hiện việc này không?

+0

Ý tưởng hay, nhưng tôi không tìm thấy bất kỳ vòng lặp nào ngắn hơn. – Christian13467

+0

Tại sao bạn muốn thực hiện việc này thay vì chọn lựa chọn lọc khác? – David

+0

Bởi vì tôi muốn xác định "lát" lớn nhất của một điều kiện nhất định. Việc kiểm tra là trong một phần phức tạp hơn của mã, và tôi gọi nó với lát nhỏ hơn và nhỏ hơn. – Thorsten

Trả lời

3

Nói chung, bạn không muốn làm điều này. Bạn có một bộ sưu tập lớn trong bộ nhớ, và bây giờ bạn muốn tạo một bản sao của nó. Điều đó sẽ sử dụng ngay cả bộ nhớ hơn. Thông thường trong các trường hợp như thế này bạn vượt qua toàn bộ bộ sưu tập xung quanh (bằng cách tham chiếu, không phải giá trị) và cũng cung cấp chỉ mục bắt đầu và dừng. Để nó vào các chức năng khác để chỉ xử lý phạm vi được chỉ định.

+0

Vâng, đối với trường hợp sử dụng cụ thể của tôi, tôi không thực sự thấy một vấn đề vì tôi sẽ chủ yếu là đối phó với các bộ sưu tập khá nhỏ (<10 mục - tôi bỏ qua các tiêu chí nơi trong truy vấn của tôi). Bộ nhớ nhỏ/thời gian chạy trên đầu của việc sao chép dường như với tôi nhỏ hơn độ phức tạp của mã mà nó sẽ giới thiệu. – Thorsten

+0

+1, PL/SQL không phải là C - không có con trỏ. – DCookie

+1

Không phải con trỏ chính xác, nhưng bạn có thể thấy gợi ý 'NOCOPY' trên tham số. Xem http://www.dba-oracle.com/t_plsql_passing_data_structures_nocopy.htm –

Các vấn đề liên quan