Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Song song các cuộc gọi trong PL / SQL

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ọi DBMS_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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bộ điều hợp mạng không thể thiết lập kết nối - Oracle 11g

  2. Cài đặt Oracle Client từ dòng lệnh mà không cần người dùng tương tác

  3. Sự khác biệt ngầm định của luồng dữ liệu CAST so với ssis

  4. Tắt và sau đó bật tất cả các chỉ mục bảng trong Oracle

  5. Mệnh đề OVER trong Oracle