Anda dapat menggunakan dbms_job
(atau dbms_scheduler
) paket untuk mengirimkan pekerjaan yang akan berjalan secara paralel. Jika Anda menggunakan dbms_job
, mengirimkan pekerjaan akan menjadi bagian dari transaksi sehingga pekerjaan akan dimulai setelah transaksi selesai.
CREATE PACKAGE BODY pkg IS
CREATE PROCEDURE do
IS
l_jobno pls_integer;
BEGIN
dbms_job.submit(l_jobno, 'begin other_pkg.other_proc; end;' );
dbms_job.submit(l_jobno, 'begin other_pkg2.other_proc2; end;' );
dbms_job.submit(l_jobno, 'begin other_pkg3.other_proc3; end;' );
END;
END;
Jika Anda menggunakan dbms_scheduler
, membuat pekerjaan baru tidak bersifat transaksional (yaitu akan ada komitmen implisit setiap kali Anda membuat pekerjaan baru) yang dapat menyebabkan masalah dengan integritas transaksional jika ada pekerjaan lain yang dilakukan dalam transaksi di mana prosedur ini dipanggil. Di sisi lain, jika Anda menggunakan dbms_scheduler
, mungkin lebih mudah untuk membuat pekerjaan terlebih dahulu dan menjalankannya dari prosedur (atau menggunakan dbms_scheduler
untuk membuat rantai yang menjalankan pekerjaan sebagai respons terhadap beberapa tindakan atau peristiwa lain seperti menempatkan pesan di antrian).
Tentu saja, dengan salah satu solusi tersebut, Anda perlu membangun infrastruktur untuk memantau kemajuan ketiga pekerjaan ini dengan asumsi bahwa Anda peduli kapan dan apakah mereka berhasil (dan apakah mereka menghasilkan kesalahan).
Jika Anda akan menggunakan DBMS_SCHEDULER
- Tidak perlu menggunakan SQL dinamis. Anda dapat membuang
EXECUTE IMMEDIATE
dan panggil sajaDBMS_SCHEDULER
prosedur paket secara langsung seperti yang Anda lakukan pada prosedur lainnya. - Saat Anda memanggil
RUN_JOB
, Anda harus memasukkan parameter kedua.use_current_session
parameter mengontrol apakah pekerjaan berjalan di sesi saat ini (dan memblokir) atau apakah itu berjalan di sesi terpisah (dalam hal ini sesi saat ini dapat melanjutkan dan melakukan hal-hal lain). Karena Anda ingin menjalankan beberapa pekerjaan secara paralel, Anda harus memasukkan nilaifalse
. - Meskipun tidak diperlukan, akan lebih konvensional untuk membuat pekerjaan satu kali (dengan
auto_drop
setel ke false) lalu jalankan saja dari prosedur Anda.
Jadi Anda mungkin ingin membuat pekerjaan di luar paket dan kemudian prosedur Anda akan menjadi
CREATE PACKAGE BODY pkg IS
CREATE PROCEDURE do
IS
BEGIN
DBMS_SCHEDULER.RUN_JOB('job_other_pkg.other_proc', false);
DBMS_SCHEDULER.RUN_JOB('job_other_pkg2.other_proc2', false);
DBMS_SCHEDULER.RUN_JOB('job_other_pkg3.other_proc3', false);
END;
END;