Blok anonim tidak dapat mengembalikan apa pun. Anda dapat menetapkan nilai ke variabel bind, termasuk tipe koleksi atau kursor ref, di dalam blok. Tetapi koleksi harus didefinisikan, serta dideklarasikan, di luar blok. Artinya, itu harus menjadi tipe yang dapat Anda gunakan dalam SQL biasa, bukan sesuatu yang didefinisikan dalam PL/SQL. Saat ini Anda menggunakan tipe PL/SQL yang didefinisikan di dalam blok, dan variabel yang dideklarasikan di dalam blok juga - jadi itu di luar jangkauan klien, dan juga bukan tipe yang valid di luarnya . (Ini juga tidak perlu diinisialisasi, tapi itu masalah kecil).
Bergantung pada bagaimana itu akan benar-benar dikonsumsi, satu opsi adalah menggunakan kursor ref, dan Anda dapat mendeklarasikan dan menampilkannya melalui SQL*Plus atau SQL Developer dengan variable
dan print
perintah. Misalnya:
variable rc sys_refcursor
begin
open :rc for ( select ... /* your cursor statement */ );
end;
/
print rc
Anda dapat melakukan hal serupa dari aplikasi klien, mis. memiliki fungsi mengembalikan kursor ref atau prosedur dengan parameter keluar yang merupakan kursor ref, dan mengikatnya dari aplikasi. Kemudian ulangi kursor ref sebagai hasil yang ditetapkan. Namun detailnya bergantung pada bahasa yang digunakan aplikasi Anda.
Pilihan lain adalah memiliki fungsi pipelined yang mengembalikan tipe tabel - lagi didefinisikan pada tingkat SQL (dengan create type
) tidak dalam PL/SQL - yang mungkin menghabiskan lebih sedikit sumber daya daripada koleksi yang dikembalikan sekaligus.
Tapi saya harus mempertanyakan mengapa Anda melakukan ini. Anda mengatakan "menggali untuk batch selanjutnya membutuhkan lebih banyak waktu", yang terdengar seperti Anda menggunakan mekanisme paging dalam kueri Anda, menghasilkan nomor baris dan kemudian memilih kisaran 100 di dalamnya. Jika klien/aplikasi Anda ingin mendapatkan semua baris maka akan lebih mudah untuk memiliki satu eksekusi kueri tetapi ambil hasil diatur dalam batch.
Sayangnya tanpa informasi apapun tentang aplikasi ini hanya spekulasi...