2011-09-16 48 views
6

Tôi cần thu thập nhiều id từ một vài bảng khác nhau thành một biến số nào đó được chuyển đến một hàm khác. Bảng nào để lấy id từ động, tùy thuộc vào thông số iVar bên dưới. Câu hỏi đặt ra là nếu không có cách nào tốt hơn để làm điều này vì cách tiếp cận này sẽ phải sao chép và phân bổ lại các mảng nhiều lần. Nó sẽ là tốt hơn để chèn nó tất cả trong một bảng tạm thời? Nó sẽ là tốt hơn để sử dụng sql năng động. Xem get_ids chức năng dưới đây:Kết hợp các bộ sưu tập trong PLSQL

FUNCTION concat (
    iList1 IN ID_ARRAY, 
iList2 IN ID_ARRAY 
) 
RETURN ID_ARRAY IS 
    lConcat ID_ARRAY; 
BEGIN 
    SELECT column_value BULK COLLECT INTO lConcat FROM (
     (SELECT column_value FROM TABLE(CAST(iList1 AS ID_ARRAY))) 
     UNION ALL 
     (SELECT column_value FROM TABLE(CAST(iList2 AS ID_ARRAY))) 
    ); 
    RETURN lConcat; 
END concat; 

FUNCTION get_ids (
    iVar   IN NUMBER 
) 
RETURN ID_ID_ARRAY IS 
    lIds ID_ARRAY; 
BEGIN 
    lids := get_ids0(); 
    IF iVar = 1 THEN 
     lIds := concat(lFilter, get_ids1()); 
    ELSE 
     lIds := concat(lFilter, get_ids3()); 
     IF iVar = 4 THEN 
      lIds := concat(lFilter, get_ids4()); 
     END IF; 
    END IF; 
    RETURN lIds; 
END get_ids; 

Trả lời

4

Hóa ra có một cách đơn giản hơn nhiều để tiếp nhau: (.. Tín dụng https://forums.oracle.com/forums/thread.jspa?messageID=7420028 tôi không có ý tưởng này là có thể đến ngày hôm nay)

iList1 MULTISET UNION ALL iList2 

+5

TẤT CẢ là tùy chọn. MULTISET UNION không sắp xếp lọc các mục nhập. – APC

+0

phải là "không sắp xếp HOẶC lọc" 8-) – APC

8

Nếu bạn đang sử dụng 10g trở lên, bạn có thể làm cho hàm CONCAT() hiệu quả hơn một chút bằng cách sử dụng toán tử MULTISET UNION:

FUNCTION concat (
    iList1 IN ID_ARRAY, 
     iList2 IN ID_ARRAY 
) 
RETURN ID_ARRAY IS 
    lConcat ID_ARRAY; 
BEGIN 
    lConcat := iList1 
       MULTISET UNION 
       iList2 A 
    ; 
    RETURN lConcat; 
END concat; 

Bạn có thể làm cho mọi việc hiệu quả hơn bằng cách Populating mảng khác nhau và sau đó gọi MultiSet UNION một lần cho tất cả trong số họ:

lConcat := iList1 
       MULTISET UNION 
       iList2 
       MULTISET UNION 
       iList3 
       MULTISET UNION 
       iList4; 

Sử dụng SQL động - có lẽ để thay thế get_idsN() chức năng khác nhau - có thể là một cách tiếp cận giá trị điều tra , nhưng có lẽ sẽ không cung cấp cho bạn nhiều, nếu có, theo cách cải thiện hiệu suất.

Bảng tạm thời không phải là một ý tưởng hay vì chúng hoạt động rất kém so với làm việc trong bộ nhớ.

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