全部产品
Search
文档中心

PolarDB:DBMS_JOB

更新时间:Jul 03, 2025

PolarDB menyediakan ekstensi DBMS_JOB untuk menjadwalkan dan mengelola tugas terjadwal. Topik ini menjelaskan cara membuat, mengelola, dan menghapus tugas terjadwal.

Prasyarat

  • Versi kernel PolarDB cluster Anda harus 1.1.7 atau lebih baru. Lihat Catatan Rilis.

    Catatan

    Untuk memeriksa versi revisi PolarDB for PostgreSQL (Compatible with Oracle) cluster Anda, gunakan pernyataan berikut:

    SHOW polar_version;
  • Untuk alasan keamanan, Anda tidak dapat membuat ekstensi DBMS_JOB secara manual. Untuk membuat ekstensi tersebut, hubungi kami.

Catatan penggunaan

  • Hanya akun dengan hak istimewa yang dapat menggunakan ekstensi DBMS_JOB. Untuk informasi lebih lanjut tentang pembuatan akun dengan hak istimewa, lihat Buat Akun Database.

  • Ekstensi dbms_job hanya dapat dibuat di dalam database postgres. Jika ingin mengonfigurasi tugas terjadwal untuk database lainnya, konfigurasikan tugas lintas-database di dalam database postgres. Untuk detail lebih lanjut, lihat Jalankan Tugas Terjadwal Lintas-Databse.

Siapkan data uji

Catatan

Data uji hanya berlaku untuk contoh-contoh dalam topik ini.

Buat tabel bernama jobrun untuk pengujian, seperti pada contoh berikut:

CREATE TABLE jobrun (
    id              serial               NOT NULL PRIMARY KEY,
    runtime         VARCHAR2(40)
);

Buat prosedur tersimpan bernama job_proc, seperti pada contoh berikut:

CREATE PROCEDURE job_proc
IS
BEGIN
    INSERT INTO jobrun(runtime) VALUES ('job_proc run at ' || TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'));
END;

Hapus ekstensi DBMS_JOB

Peringatan

Menghapus ekstensi DBMS_JOB akan menghapus semua tugas pengguna terkait dengan ekstensi tersebut.

Gunakan sintaks berikut untuk menghapus ekstensi DBMS_JOB:

DROP EXTENSION dbms_job CASCADE;

Buat tugas terjadwal

Syntax

SUBMIT(job OUT BINARY_INTEGER, what VARCHAR2
[, next_date DATE [, interval VARCHAR2 ]])

Tabel 1. Parameter

Parameter

Deskripsi

job

Nilai jobid yang Anda lewatkan. Setelah Anda melewati nilai jobid, ID tugas yang dikirimkan akan dikembalikan. ID tugas dibuat secara otomatis dan unik untuk setiap tugas.

what

Nama prosedur tersimpan yang ingin Anda panggil. Anda harus menentukan parameter ini. Prosedur tersimpan job_proc digunakan dalam contoh-contoh dalam topik ini.

next_date

Waktu mulai tugas terjadwal. Jika Anda tidak menentukan parameter ini, waktu saat ini akan digunakan secara otomatis.

interval

Interval di mana tugas terjadwal dijalankan. Untuk informasi lebih lanjut, lihat Deskripsi interval.

Tabel 2. Deskripsi Interval

Interval eksekusi

Contoh

Setiap menit

TRUNC(sysdate,'mi') + 1/(24*60)

Setiap hari

Sistem menjalankan tugas pada pukul 01:00:00 setiap hari:

TRUNC(sysdate) + 1 + 1/(24)

Setiap minggu

Sistem menjalankan tugas pada pukul 01:00:00 setiap hari Senin:

TRUNC(next_day(sysdate,'monday')) + 1/24

Setiap bulan

Sistem menjalankan tugas pada pukul 01:00:00 pada hari pertama setiap bulan:

TRUNC(LAST_DAY(SYSDATE)) + 1 + 1/24

Setiap kuartal

Sistem menjalankan tugas pada pukul 01:00:00 pada hari pertama setiap kuartal:

TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24

Setiap tahun

Sistem menjalankan tugas pada pukul 01:00:00 pada tanggal 1 Januari setiap tahun:

ADD_MONTHS(trunc(sysdate,'yyyy'), 12) + 1/24

Titik tetap dalam waktu

Sistem menjalankan tugas pada pukul 08:10:00 setiap pagi:

Trunc(Sysdate+1) + (8*60+10)/24*60

Interval tetap

Sistem menjalankan tugas pada menit kelima belas setiap jam, seperti 08:15:00, 09:15:00, dan 10:15:00.

Trunc(sysdate,'hh') + (60+15)/(24*60)

Panggil prosedur tersimpan job_proc untuk membuat tugas terjadwal, seperti pada contoh berikut:

DECLARE
   jobid           INTEGER;
BEGIN
   DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24 * 60)');
END;
Catatan

Jika Anda menggunakan tanda kutip tunggal saat membuat tugas terjadwal, kutipan bersarang akan muncul dalam pernyataan, yang dapat menyebabkan kesalahan sintaksis. Contoh berikut menunjukkan hal ini:

DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'TRUNC(sysdate,'mi') + 1/(24*60)');

Untuk mencegah kesalahan ini, apit nilai parameter yang sesuai dengan simbol $$, seperti pada contoh berikut:

DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, $$TRUNC(sysdate,'mi') + 1/(24*60)$$);

Kueri tugas terjadwal

Gunakan pernyataan berikut untuk mengkueri tugas terjadwal yang dibuat oleh pengguna saat ini:

SELECT * FROM sys.user_jobs;

Ubah konten, waktu mulai, dan interval eksekusi tugas terjadwal

Syntax

CHANGE(job BINARY_INTEGER what VARCHAR2, next_date DATE,interval VARCHAR2)

Tabel 3. Parameter

Parameter

Deskripsi

job

ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal.

what

Nama prosedur tersimpan yang ingin Anda panggil.

Catatan

Jika Anda ingin menggunakan nilai saat ini, atur parameter ini ke NULL.

next_date

Waktu mulai tugas terjadwal.

Catatan

Jika Anda ingin menggunakan nilai saat ini, atur parameter ini ke NULL.

interval

Interval di mana tugas terjadwal dijalankan. Untuk informasi lebih lanjut, lihat Deskripsi interval.

Catatan

Jika Anda ingin menggunakan nilai saat ini, atur parameter ini ke NULL.

Misalnya, Anda ingin mengubah tugas terjadwal dengan ID tugas 1 tanpa mengubah prosedur tersimpan. Anda juga ingin mengatur waktu mulai menjadi 29 Desember 2020 dan menjalankan tugas setiap 15 menit sekali. Contoh berikut memberikan ilustrasi:

BEGIN
    DBMS_JOB.CHANGE(1,NULL,TO_DATE('29-DEC-20','DD-MON-YY'),$$Trunc(sysdate,'hh') + (60+15)/(24*60)$$);
END;

Ubah interval eksekusi tugas terjadwal

Syntax

INTERVAL(job BINARY_INTEGER, interval VARCHAR2)

Tabel 4. Parameter

Parameter

Deskripsi

job

ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal.

interval

Interval di mana tugas terjadwal dijalankan. Untuk informasi lebih lanjut, lihat Deskripsi interval.

Misalnya, Anda ingin mengubah tugas terjadwal dengan ID tugas 1 agar berjalan setiap hari pukul 01:00:00. Contoh berikut memberikan ilustrasi:

BEGIN
    DBMS_JOB.INTERVAL(1,'TRUNC(sysdate) + 1 + 1/(24)');
END;

Ubah waktu mulai tugas terjadwal

Syntax

NEXT_DATE(job BINARY_INTEGER, next_date DATE)

Tabel 5. Parameter

Parameter

Deskripsi

job

ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal.

next_date

Waktu mulai tugas terjadwal.

Misalnya, Anda ingin mengubah waktu mulai tugas terjadwal dengan ID tugas 1 menjadi 30 Desember 2020. Contoh berikut memberikan ilustrasi:

BEGIN
    DBMS_JOB.NEXT_DATE(1, TO_DATE('30-DEC-20','DD-MON-YY'));
END;

Ubah konten tugas terjadwal

Syntax

WHAT(job BINARY_INTEGER, what VARCHAR2)

Tabel 6. Parameter

Parameter

Deskripsi

job

ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal.

what

Nama prosedur tersimpan yang ingin Anda panggil.

Misalnya, Anda ingin mengubah tugas terjadwal dengan ID tugas 1 untuk menggunakan prosedur tersimpan job_proc2. Contoh berikut memberikan ilustrasi:

BEGIN
    DBMS_JOB.WHAT(1,'job_proc2');
END;

Hentikan dan jalankan ulang tugas terjadwal

Syntax

BROKEN(job BINARY_INTEGER, broken BOOLEAN [, next_date DATE ])

Tabel 7. Parameter

Parameter

Deskripsi

job

ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal.

broken

Keadaan tugas terjadwal. Nilai yang valid:

  • true: Keadaan tugas terjadwal tidak normal. Jika keadaan tugas terjadwal tidak normal, tugas terjadwal dihentikan. Anda dapat menjalankan perintah dbms_job.run untuk memaksa tugas terjadwal dengan keadaan tidak normal untuk berjalan.

  • false: Keadaan tugas terjadwal normal.

next_date

Waktu mulai tugas terjadwal. Jika Anda tidak menentukan parameter ini, waktu saat ini akan digunakan secara otomatis.

Tetapkan status tugas terjadwal dengan ID tugas 1 sebagai tidak normal. Contoh berikut memberikan ilustrasi:

BEGIN
    DBMS_JOB.BROKEN(1,true);
END;

Tetapkan status tugas terjadwal dengan ID tugas 1 sebagai normal. Contoh berikut memberikan ilustrasi:

BEGIN
    DBMS_JOB.BROKEN(1,false);
END;

Paksa tugas terjadwal untuk berjalan

Syntax

RUN(job BINARY_INTEGER)

Tabel 8. Parameter

Parameter

Deskripsi

job

ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal.

Paksa tugas terjadwal dengan ID tugas 1 untuk berjalan. Contoh berikut memberikan ilustrasi:

BEGIN
    DBMS_JOB.RUN(1);
END;
Catatan

Jika pesan kesalahan serupa dengan berikut ini muncul setelah Anda menggunakan alat klien untuk terhubung ke database dan mengeksekusi pernyataan sebelumnya, alat klien tersebut tidak didukung. Gunakan PolarDB-Tools sebagai gantinya. Untuk informasi lebih lanjut, lihat PolarDB-Tools.

ERROR: syntax error at end of input
CONTEXT: polar-spl function dbms_job._run_job(integer,boolean) line 151 at RAISE line 547 of package body

Hapus tugas terjadwal

Syntax

REMOVE(job BINARY_INTEGER)

Tabel 9. Parameter

Parameter

Deskripsi

job

ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal.

Hapus tugas terjadwal dengan ID tugas 1. Contoh berikut memberikan ilustrasi:

BEGIN
    DBMS_JOB.REMOVE(1);
END;

Kueri catatan eksekusi tugas terjadwal

Gunakan pernyataan berikut untuk mengkueri catatan eksekusi tugas terjadwal Anda:

SELECT * FROM dbmsjob.pga_joblog;

Jalankan tugas terjadwal lintas-database

Ekstensi DBMS_JOB hanya berlaku untuk database postgres. Untuk mengonfigurasi tugas terjadwal pada database lain, atur tugas terjadwal lintas-database di dalam database postgres.

Contoh berikut menjelaskan cara mengonfigurasi tugas terjadwal lintas-database. Dalam contoh ini, ekstensi DBMS_JOB dikonfigurasi di dalam database postgres, sedangkan tugas terjadwal dikonfigurasi untuk berjalan di dalam database bernama test. Tujuan dari contoh ini adalah menyisipkan satu rekaman data per menit ke dalam tabel di dalam database test. Untuk informasi lebih lanjut tentang pembuatan database, lihat Buat Database.

  1. Buat tabel bernama jobrun dan prosedur tersimpan bernama job_proc di dalam database test.

    • Gunakan pernyataan berikut untuk membuat tabel bernama jobrun:

      CREATE TABLE public.jobrun (
          id       serial NOT NULL PRIMARY KEY,
          runtime  VARCHAR2(40)
      );
    • Gunakan pernyataan berikut untuk membuat prosedur tersimpan bernama job_proc:

      CREATE PROCEDURE public.job_proc
      IS
      BEGIN
          INSERT INTO jobrun(runtime) VALUES ('job_proc run at ' || TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'));
      END;
  2. Buat tugas terjadwal di dalam database postgres.

    Tambahkan nama database tempat Anda ingin menjalankan tugas terjadwal ke fungsi DBMS_JOB.SUBMIT(). Dalam contoh ini, tugas terjadwal dijalankan di dalam database bernama test. Untuk informasi lebih lanjut tentang parameter lainnya, lihat Buat Tugas Terjadwal.

    Contoh berikut memberikan ilustrasi:

    DECLARE
       jobid           INTEGER;
    BEGIN
       DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24 * 60)','test');
    END;
  3. Kueri status dan catatan eksekusi tugas terjadwal di dalam database postgres.

    • Kueri tugas terjadwal:

      SELECT * FROM sys.user_jobs;

      Keluaran berikut akan ditampilkan:

       job | jobloguser | job_user | database |           job_created            |           job_changed            |            last_date             | last_sec |         next_date         | next_sec |   total_time    | broken |                 interval                 | failures |                                                      what                                                       | instance
      -----+------------+----------+----------+----------------------------------+----------------------------------+----------------------------------+----------+---------------------------+----------+-----------------+--------+------------------------------------------+----------+-----------------------------------------------------------------------------------------------------------------+----------
         1 | DBUSER     | dbuser   | postgres | 29-OCT-20 02:38:49.478494 +00:00 | 29-OCT-20 02:38:49.478494 +00:00 | 29-OCT-20 02:51:12.025001 +00:00 | 02:51:12 | 29-OCT-20 02:53:12 +00:00 | 02:53:12 | 00:00:00.243224 | N      | BEGIN return SYSDATE + 1/(24 * 30); END; |        0 |  BEGIN EXECUTE IMMEDIATE 'SELECT dbmsjob.dbms_job_internal_job_link(''BEGIN job_proc; END;'', ''test'');' ; END |        0
    • Kueri catatan eksekusi:

      SELECT * FROM dbmsjob.pga_joblog;

      Keluaran berikut akan ditampilkan:

       jlgid | jlgjobid | jlgstatus |             jlgstart             |   jlgduration   
      -------+----------+-----------+----------------------------------+-----------------
           1 |        1 | s         | 29-OCT-20 02:38:49.762995 +00:00 | 00:00:00.017495
           2 |        1 | s         | 29-OCT-20 02:39:50.061113 +00:00 | 00:00:00.016463
           3 |        1 | s         | 29-OCT-20 02:40:50.062331 +00:00 | 00:00:00.016244
  4. Kueri data dalam tabel jobrun di dalam database test.

    Gunakan pernyataan berikut:

    SELECT * FROM jobrun;

    Keluaran berikut akan ditampilkan:

     id |               runtime               
    ----+-------------------------------------
      1 | job_proc run at 2020-10-29 02:38:50
      2 | job_proc run at 2020-10-29 02:39:50
      3 | job_proc run at 2020-10-29 02:40:50
Catatan

Jika ingin mengubah informasi tentang tugas terjadwal lintas-database, tambahkan nama database postgres tempat Anda ingin menjalankan tugas terjadwal saat mengubah fungsi. Sebagai contoh, jika ingin mengubah interval eksekusi dari setiap menit menjadi setiap dua menit, gunakan pernyataan berikut:

BEGIN
    DBMS_JOB.CHANGE(1,NULL,SYSDATE,'SYSDATE + 1/(24 * 30)','test');
END;