2011-01-20 78 views
10

Tôi đang cố gắng viết một hàm trả về kết quả của một truy vấn chọn. Tôi đã làm việc với các chức năng rất cơ bản mà sẽ trả về một số và một varchar2 (chuỗi). Nhưng bây giờ tôi muốn trả lại kết quả của một lựa chọn, mà sẽ giống như 10 hàng và cột tương ứng của họ.Chức năng sẽ trả về dữ liệu được truy xuất từ ​​một truy vấn chọn - Oracle

Làm cách nào để viết chức năng và loại trả về sẽ là gì?

Một chức năng ví dụ mà tôi đã viết là:

tạo hoặc thay thế chức năng Func1 trở varchar2 như bắt đầu return ('hello từ Func1'); kết thúc func1;

Tôi vẫn ở mức cơ bản, vì vậy bất kỳ ai cũng có thể giúp tôi với kết quả của truy vấn chọn? Tôi tin rằng con trỏ sẽ được sử dụng, vì sẽ có nhiều hơn một hàng.

Trả lời

17

Thông thường, hàm trả về một "điều" duy nhất. Thông thường, đó là một vô hướng (một số, một varchar2, một bản ghi, vv) mặc dù bạn có thể trả về một bộ sưu tập. Vì vậy, ví dụ, bạn có thể trở lại một bộ sưu tập (trong trường hợp này một bảng lồng nhau) với tất cả các giá trị EMPNO từ bảng EMP

CREATE TYPE empno_tbl 
    IS TABLE OF NUMBER; 

CREATE OR REPLACE FUNCTION get_empnos 
    RETURN empno_tbl 
IS 
    l_empnos empno_tbl; 
BEGIN 
    SELECT empno 
    BULK COLLECT INTO l_empnos 
    FROM emp; 
    RETURN l_empnos; 
END; 

Nhưng đây không phải là một điều đặc biệt là phổ biến để làm trong một hàm. Sẽ phổ biến hơn một chút để hàm trả về con trỏ thay vì trả về giá trị và để cho trình xử lý cuộc gọi tìm nạp dữ liệu, tức là

CREATE OR REPLACE FUNCTION get_empnos2 
    RETURN SYS_REFCURSOR 
IS 
    l_rc SYS_REFCURSOR; 
BEGIN 
    OPEN l_rc 
    FOR SELECT empno 
     FROM emp; 
    RETURN l_rc; 
END; 

Nhưng thậm chí điều đó không đặc biệt phổ biến trong Oracle. Tùy thuộc vào những gì bạn đang cố gắng hoàn thành, thường sẽ đơn giản hơn khi tạo chế độ xem đã chọn dữ liệu bạn quan tâm và truy vấn chế độ xem đó thay vì gọi hàm hoặc thủ tục.

+1

+1 để biết ví dụ. Ngoài ra, ví dụ thứ hai là khá phổ biến trong các hệ thống mà ứng dụng truy cập dữ liệu là thông qua các thủ tục được lưu trữ và thường kết hợp với một cái gì đó như iBatis ở phía ứng dụng – bhangm

+0

Bạn là người đàn ông !! Cảm ơn bạn vì những ví dụ đơn giản. – macha

1

Nếu không có ngữ cảnh về cách bạn sẽ gọi chức năng này, tôi sẽ mất một chút chính xác cách giúp bạn.

Bạn có chắc chắn sẽ không tốt hơn với lựa chọn, tham gia hoặc xem thay thế không?

+1

Vâng để được thẳng thắn, tôi chỉ muốn tìm hiểu làm thế nào các chức năng sẽ được thực hiện. Không phân biệt việc sử dụng nó hoặc thực hiện vv Tôi đang học plsql hiện nay, vì vậy tôi muốn tìm hiểu trở về hàng. – macha

2

Vâng, nếu bạn vừa mới học, bạn nên biết về các hàm pipelined. Một hàm pipelined cho phép bạn trả về các bảng được tạo động trong vòng PLSQL.

Ví dụ ...

create function 
     gen_numbers(n in number default null) 
     return array 
     PIPELINED 
    as 
    begin 
    for i in 1 .. nvl(n,999999999) 
     loop 
     pipe row(i); 
    end loop; 
    return; 
    end; 

Mà tôi mượn từ http://www.akadia.com/services/ora_pipe_functions.html :-)

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