2012-05-17 10 views
7

Tôi có một quy trình thực hiện một số phép tính trên tất cả các bản ghi được con trỏ trả về. Có vẻ như sau:Tôi có thể chuyển con trỏ rõ ràng đến một hàm/thủ tục để sử dụng trong vòng lặp FOR không?

PROCEDURE do_calc(id table.id_column%TYPE) 
IS 
    CURSOR c IS 
    SELECT col1, col2, col3 
     FROM table 
    WHERE ...; 
BEGIN 
    FOR r IN c LOOP 
    -- do some complicated calculations using r.col1, r.col2, r.col3 etc. 
    END LOOP; 
END; 

Bây giờ tôi có trường hợp cần thực hiện cùng một phép tính trên một bộ hồ sơ khác đến từ một bảng khác. Tuy nhiên, chúng có cùng "hình dạng" như trong ví dụ trên.

Có thể viết một thủ tục mà trông như thế này:

PROCEDURE do_calc2(c some_cursor_type) 
IS 
BEGIN 
    FOR r IN c LOOP 
    -- do the calc, knowing we have r.col1, r.col2, r.col3, etc. 
    END LOOP; 
END; 

tôi biết về SYS_REFCURSOR, nhưng tôi đã tự hỏi nếu nó đã có thể sử dụng thuận tiện hơn nhiều FOR ... LOOP cú pháp và loại kỷ lục tiềm ẩn.

Trả lời

8

Tạo gói.

Khai báo con trỏ của bạn dưới dạng biến gói.

Sử dụng %rowtype để đặt loại thông số chức năng.

create or replace package test is 
    cursor c is select 1 as one, 2 as two from dual; 

    procedure test1; 
    function test2(test_record c%ROWTYPE) return number; 

end test; 


create or replace package body test is 
    procedure test1 is  
    begin 
    for r in c loop  
     dbms_output.put_line(test2(r)); 
    end loop; 
    end; 

    function test2(test_record c%ROWTYPE) return number is 
    l_summ number; 
    begin 
    l_summ := test_record.one + test_record.two; 
    return l_summ; 
    end; 
end test; 
+0

Cảm ơn Vasily, tôi đã không chắc chắn PL/SQL có thể xử lý rằng mức độ đánh máy structual, nhưng nó hoạt động như một sự quyến rũ! :-) –

+0

Bạn được chào đón) –

+0

hi @VasilyKomarov .. nếu câu lệnh con trỏ có tham số mà bạn chuyển làm đầu vào cho tất cả các hàm và thủ tục trong gói .. như ví dụ .. con trỏ c được chọn 1 làm một, 2 là hai từ hai nơi hàng = row_id; trong đó row_id là tham số – thealchemist

0

Có bạn có thể sử dụng con trỏ một cách rõ ràng thành thủ tục và chức năng, cho con trỏ mà cần phải khai báo vào gói như biến