Bạn có thể sử dụng dbms_job
(hoặc dbms_scheduler
) gói để gửi các công việc sẽ chạy song song. Nếu bạn đang sử dụng dbms_job
, việc gửi công việc sẽ là một phần của giao dịch, do đó, công việc sẽ bắt đầu sau khi giao dịch hoàn tất.
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;
Nếu bạn đang sử dụng dbms_scheduler
, việc tạo một công việc mới không phải là giao dịch (tức là sẽ có các cam kết ngầm mỗi khi bạn tạo một công việc mới), điều này có thể gây ra các vấn đề về tính toàn vẹn của giao dịch nếu có công việc khác đang được thực hiện trong giao dịch nơi quy trình này được gọi. Mặt khác, nếu bạn đang sử dụng dbms_scheduler
, có thể dễ dàng hơn để tạo công việc trước và chỉ cần chạy chúng từ quy trình (hoặc sử dụng dbms_scheduler
để tạo một chuỗi chạy công việc theo một số hành động hoặc sự kiện khác, chẳng hạn như đặt thông báo vào hàng đợi).
Tất nhiên, với một trong hai giải pháp, sau đó bạn cần phải xây dựng cơ sở hạ tầng để theo dõi tiến độ của ba công việc này với giả định rằng bạn quan tâm khi nào và liệu chúng có thành công hay không (và liệu chúng có tạo ra lỗi hay không).
Nếu bạn định sử dụng DBMS_SCHEDULER
- Không cần sử dụng SQL động. Bạn có thể bỏ
EXECUTE IMMEDIATE
và chỉ cần gọiDBMS_SCHEDULER
thủ tục của gói hàng trực tiếp giống như bạn làm với bất kỳ thủ tục nào khác. - Khi bạn gọi
RUN_JOB
, bạn cần chuyển vào tham số thứ hai.use_current_session
tham số kiểm soát việc công việc chạy trong phiên hiện tại (và các khối) hay nó chạy trong một phiên riêng biệt (trong trường hợp đó, phiên hiện tại có thể tiếp tục và làm những việc khác). Vì bạn muốn chạy nhiều công việc song song, bạn cần phải chuyển giá trịfalse
. - Mặc dù không bắt buộc, nhưng sẽ thông thường hơn nếu tạo công việc một lần (với
auto_drop
đặt thành false) và sau đó chỉ cần chạy chúng từ quy trình của bạn.
Vì vậy, bạn có thể muốn tạo các công việc bên ngoài gói và sau đó thủ tục của bạn sẽ trở thành
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;