2012-10-24 31 views
5

Tôi có một chức năng oracle PLSQL chấp nhận một mảng:đèo lựa chọn công bố để Oracle PLSQL

CREATE OR REPLACE FUNCTION CM.give_me_an_arrays (p_array IN num_array) 
RETURN VARCHAR2 
IS 
x VARCHAR2 (512); 
BEGIN 
x := ''; 
    FOR i IN 1 .. p_array.COUNT 
    LOOP 
     DBMS_OUTPUT.put_line (p_array (i)); 
    END LOOP; 

    RETURN x; 
END; 
/

tôi muốn làm điều đó:

select CM.give_me_an_arrays(select COM.COM_ID 
           from CM.XLP_SE_COMPONENT com 
          where rownum < 10) 
    from dual 

Bất kỳ ý tưởng? Cảm ơn trước.

+1

Có một lý do nào đó mà hàm cần chấp nhận một mảng không? Nó có thể chấp nhận một con trỏ thay vì? Điều đó thường sẽ có ý nghĩa hơn nếu bạn muốn chuyển qua kết quả của câu lệnh 'SELECT'. Nếu bạn đang dùng kết quả của truy vấn trả về 10 hàng và tạo ra một kết quả tổng hợp, bạn có chắc chắn rằng bạn không muốn viết hàm tổng hợp tùy chỉnh thay thế không? –

Trả lời

5

Bạn có thể làm điều này miễn là mảng là một đối tượng sql (thử nghiệm trên 11gR2, nên làm việc trên 10g):

SQL> create or replace type num_array is table of number; 
    2/

Type created. 

SQL> CREATE OR REPLACE FUNCTION give_me_an_arrays (p_array IN num_array) 
    2 RETURN VARCHAR2 
    3 IS 
    4 x VARCHAR2 (512); 
    5 BEGIN 
    6 x := ''; 
    7  FOR i IN 1 .. p_array.COUNT 
    8  LOOP 
    9  DBMS_OUTPUT.put_line (p_array (i)); 
10  END LOOP; 
11 
12 RETURN x; 
13 END; 
14/

Function created. 

Bạn có thể gọi chức năng này với COLLECT chức năng tổng hợp:

SQL> SELECT give_me_an_arrays((SELECT cast(collect(rownum) AS num_array) value 
    2        FROM dual 
    3       CONNECT BY level <= 10)) arr 
    4 FROM dual; 

ARR 
-------------------------------------------------------------------------------- 


1 
2 
[..] 
10 

Trong 9i (và thậm chí có thể 8I, không thể kiểm tra ngay bây giờ), THU THẬP không tồn tại nhưng bạn có thể đã sử dụng MULTISET thay vì:

SQL> SELECT give_me_an_arrays(cast(MULTISET(SELECT rownum value 
    2           FROM dual 
    3           CONNECT BY level <= 10) AS num_array) 
    4       ) arr 
    5 FROM dual; 

ARR 
-------------------------------------------------------------------------------- 


1 
2 
[..] 
10 
Các vấn đề liên quan