Một khối ẩn danh không thể trả lại bất cứ điều gì. Bạn có thể gán giá trị cho một biến liên kết, bao gồm kiểu tập hợp hoặc con trỏ tham chiếu, bên trong khối. Nhưng tập hợp sẽ phải được xác định, cũng như được khai báo, bên ngoài khối. Có nghĩa là, nó sẽ phải là một kiểu bạn có thể sử dụng trong SQL thuần túy, không phải là một thứ được định nghĩa trong PL / SQL. Hiện tại, bạn đang sử dụng kiểu PL / SQL được xác định trong khối và một biến cũng được khai báo trong khối - vì vậy nó nằm ngoài phạm vi đối với máy khách và cũng sẽ không phải là kiểu hợp lệ bên ngoài nó . (Nó cũng không cần phải được khởi tạo, nhưng đó là một vấn đề nhỏ).
Tùy thuộc vào cách nó thực sự sẽ được sử dụng, một tùy chọn là sử dụng con trỏ tham chiếu và bạn có thể khai báo và hiển thị điều đó thông qua SQL * Plus hoặc SQL Developer với biến variable
và print
các lệnh. Ví dụ:
variable rc sys_refcursor
begin
open :rc for ( select ... /* your cursor statement */ );
end;
/
print rc
Bạn có thể làm điều gì đó tương tự từ một ứng dụng khách, ví dụ:có một hàm trả về con trỏ tham chiếu hoặc một thủ tục với tham số out là con trỏ tham chiếu và liên kết tham số đó từ ứng dụng. Sau đó, lặp lại con trỏ tham chiếu như một tập hợp kết quả. Nhưng các chi tiết phụ thuộc vào ngôn ngữ mà ứng dụng của bạn đang sử dụng.
Một tùy chọn khác là có một hàm pipelined trả về một loại bảng - lại được xác định ở cấp SQL (với create type
) không có trong PL / SQL - có thể tiêu tốn ít tài nguyên hơn một bộ sưu tập được trả lại trong một lần.
Nhưng tôi phải đặt câu hỏi tại sao bạn lại làm điều này. Bạn đã nói rằng "việc đào các lô sau sẽ mất nhiều thời gian hơn", điều này có vẻ như bạn đang sử dụng cơ chế phân trang trong truy vấn của mình, tạo ra một số hàng và sau đó chọn ra một phạm vi 100 trong đó. Nếu khách hàng / ứng dụng của bạn muốn nhận tất cả các hàng thì sẽ đơn giản hơn nếu chỉ thực hiện một truy vấn duy nhất nhưng tìm nạp kết quả được đặt theo lô.
Thật không may, không có bất kỳ thông tin nào về ứng dụng, đây chỉ là suy đoán ...