Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Memparalelkan panggilan dalam PL/SQL

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 saja DBMS_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 nilai false .
  • 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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memasukkan cap waktu di Oracle?

  2. tidak dapat memuat oci8 -> Kesalahan fatal:Panggilan ke fungsi yang tidak ditentukan oci_connect()

  3. Apakah ada rekomendasi resmi Oracle tentang penggunaan eksplisit ANSI JOIN vs implisit join?

  4. Tidak dapat masuk ke database sebagai SYS dengan Oracle SQL Developer

  5. Fitur tersembunyi di Oracle