All Products
Search
Document Center

PolarDB:DBMS_JOB

Last Updated:Aug 28, 2026

PolarDB menyediakan paket DBMS_JOB untuk menjadwalkan dan mengelola job terjadwal. Topik ini menjelaskan cara membuat, mengelola, dan menghapusnya.

Prasyarat

  • Kluster PolarDB Anda menjalankan kernel versi V1.1.7 atau yang lebih baru.

    Catatan

    Untuk memeriksa versi kernel kluster PolarDB for PostgreSQL (Compatible with Oracle) Anda, jalankan pernyataan berikut:

    SHOW polar_version;
  • Karena alasan keamanan, ekstensi DBMS_JOB tidak dapat dibuat secara manual. Jika Anda memerlukan ekstensi ini, hubungi kami untuk mengaktifkannya.

Catatan penggunaan

  • Hanya akun istimewa yang dapat menggunakan DBMS_JOB. Untuk informasi tentang cara membuat akun istimewa, lihat Buat akun database.

  • Ekstensi DBMS_JOB hanya dapat dibuat di database postgres. Untuk menggunakan job terjadwal di database lain, Anda dapat mengonfigurasi job lintas database di database postgres. Untuk informasi selengkapnya, lihat Jalankan job lintas database.

Persiapkan data uji

Catatan

Data uji ini hanya berlaku untuk contoh dalam topik ini.

Buat tabel bernama jobrun untuk pengujian:

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

Buat prosedur tersimpan bernama job_proc:

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

Peringatan

Menghapus ekstensi akan menghapus semua job pengguna yang ada.

Untuk menghapus ekstensi, gunakan sintaks berikut:

DROP EXTENSION dbms_job CASCADE;

Buat job terjadwal

Sintaksis

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

Tabel 1. Parameter

Parameter

Deskripsi

job

jobid adalah ID dari job yang dikirimkan. ID ini dihasilkan secara otomatis dan unik untuk setiap job.

what

Nama prosedur tersimpan yang akan dipanggil. Parameter ini wajib diisi. Contoh ini menggunakan prosedur tersimpan job_proc.

next_date

Waktu eksekusi berikutnya dari job terjadwal. Jika Anda tidak menentukan parameter ini, job akan dijalankan segera setelah dikirimkan.

interval

Interval pengulangan untuk job terjadwal. Untuk informasi selengkapnya, lihat Referensi INTERVAL.

Tabel 2. Referensi INTERVAL

Interval pengulangan

Contoh

Dijalankan setiap menit.

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

Setiap hari pada waktu tertentu.

Dijalankan pukul 01.00 setiap hari:

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

Setiap minggu pada waktu tertentu.

Dijalankan pukul 01.00 setiap Senin:

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

Setiap bulan pada waktu tertentu.

Dijalankan pukul 01.00 pada hari pertama setiap bulan:

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

Setiap kuartal pada waktu tertentu.

Dijalankan pukul 01.00 pada hari pertama setiap kuartal:

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

Setiap tahun pada waktu tertentu.

Dijalankan pukul 01.00 pada 1 Januari setiap tahun:

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

Dijalankan pada titik waktu tetap.

Dijalankan pukul 08.10 setiap hari:

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

Dijalankan pada interval tetap.

Dijalankan pada menit ke-15 setiap jam, seperti 08.15, 09.15, dan 10.15.

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

Panggil prosedur tersimpan job_proc untuk membuat job terjadwal. Berikut contohnya:

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

Jika ekspresi waktu berisi tanda petik tunggal, penumpukan tanda petik tersebut dapat menyebabkan error sintaks. Berikut contoh yang salah:

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

Untuk mencegah error ini, gunakan $$ dollar-quoting untuk parameter yang bersangkutan. Berikut contoh yang benar:

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

Lihat job terjadwal

Untuk melihat job terjadwal yang dibuat oleh pengguna saat ini, jalankan pernyataan berikut:

SELECT * FROM sys.user_jobs;

Ubah job terjadwal

Sintaks

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

Tabel 3. Parameter

Parameter

Deskripsi

job

ID job. Untuk menemukan ID job, lihat Lihat job terjadwal.

what

Nama prosedur tersimpan yang akan dipanggil.

Catatan

Untuk mempertahankan nilai saat ini, atur parameter ini ke NULL.

next_date

Waktu eksekusi berikutnya dari job terjadwal.

Catatan

Untuk mempertahankan nilai saat ini, atur parameter ini ke NULL.

interval

Interval pengulangan job terjadwal. Untuk informasi selengkapnya, lihat Referensi INTERVAL.

Catatan

Untuk mempertahankan nilai saat ini, atur parameter ini ke NULL.

Contoh ini mengubah job 1 agar dijalankan pada menit ke-15 setiap jam, dengan eksekusi berikutnya pada 29 Desember 2020. Prosedur tersimpan tidak diubah (NULL).

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

Ubah interval pengulangan

Sintaks

INTERVAL(job BINARY_INTEGER, interval VARCHAR2)

Tabel 4. Parameter

Parameter

Deskripsi

job

ID job. Untuk menemukan ID job, lihat Lihat job terjadwal.

interval

Interval pengulangan job terjadwal. Untuk informasi selengkapnya, lihat Referensi INTERVAL.

Contoh ini mengubah interval pengulangan job 1 menjadi pukul 01.00 setiap hari:

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

Ubah waktu eksekusi berikutnya

Sintaks

NEXT_DATE(job BINARY_INTEGER, next_date DATE)

Tabel 5. Parameter

Parameter

Deskripsi

job

ID job. Untuk menemukan ID job, lihat Lihat job terjadwal.

next_date

Waktu eksekusi berikutnya dari job terjadwal.

Contoh ini mengubah waktu eksekusi berikutnya untuk job 1 menjadi 30 Desember 2020:

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

Ubah konten job

Sintaks

WHAT(job BINARY_INTEGER, what VARCHAR2)

Tabel 6. Parameter

Parameter

Deskripsi

job

ID job. Untuk menemukan ID job, lihat Lihat job terjadwal.

what

Nama prosedur tersimpan yang akan dipanggil.

Contoh ini mengubah prosedur tersimpan untuk job 1 menjadi job_proc2:

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

Hentikan dan lanjutkan job terjadwal

Sintaks

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

Tabel 7. Parameter

Parameter

Deskripsi

job

ID job. Untuk menemukan ID job, lihat Lihat job terjadwal.

broken

Status job terjadwal. Nilai yang valid:

  • true: Menandai job sebagai rusak. Job yang rusak tidak dijalankan sesuai jadwalnya. Anda tetap dapat menjalankan paksa job yang rusak dengan menggunakan dbms_job.run.

  • false: Menandai job sebagai tidak rusak, sehingga dapat dijalankan sesuai jadwal yang ditentukan.

next_date

Waktu eksekusi berikutnya dari job terjadwal. Jika Anda tidak menentukan parameter ini, waktu saat ini digunakan secara default.

Contoh ini menandai job 1 sebagai rusak:

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

Contoh ini menandai job 1 sebagai tidak rusak:

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

Jalankan paksa job terjadwal

Sintaks

RUN(job BINARY_INTEGER)

Tabel 8. Parameter

Parameter

Deskripsi

job

ID job. Untuk menemukan ID job, lihat Lihat job terjadwal.

Contoh ini menjalankan paksa job 1 segera:

BEGIN
    DBMS_JOB.RUN(1);
END;
Catatan

Jika Anda mengalami error serupa berikut saat menjalankan pernyataan di atas menggunakan tool client, tool client Anda tidak kompatibel. Untuk mengatasinya, beralihlah ke tool client lain, seperti 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 job terjadwal

Sintaks

REMOVE(job BINARY_INTEGER)

Tabel 9. Parameter

Parameter

Deskripsi

job

ID job. Untuk menemukan ID job, lihat Lihat job terjadwal.

Contoh ini menghapus job 1:

BEGIN
    DBMS_JOB.REMOVE(1);
END;

Lihat catatan eksekusi

Untuk melihat catatan eksekusi, jalankan pernyataan berikut:

SELECT * FROM dbmsjob.pga_joblog;

Jalankan job lintas database

Ekstensi DBMS_JOB hanya dapat dibuat di database postgres. Untuk menjalankan job terjadwal di database lain, Anda harus mengonfigurasi job lintas database.

Contoh berikut mengonfigurasi job di database postgres yang dijalankan di database test. Job tersebut menyisipkan satu baris data per menit ke dalam tabel di database test. Untuk informasi selengkapnya tentang cara membuat database, lihat Manajemen database.

  1. Di database test, buat tabel bernama jobrun dan prosedur tersimpan bernama job_proc.

    • Buat tabel jobrun:

      CREATE TABLE public.jobrun (
          id       serial NOT NULL PRIMARY KEY,
          runtime  VARCHAR2(40)
      );
    • Buat prosedur tersimpan 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. Beralih ke database postgres dan buat job terjadwal.

    Dalam prosedur DBMS_JOB.SUBMIT(), Anda harus menentukan database target. Dalam contoh ini, database target adalah test. Untuk informasi tentang parameter lainnya, lihat Buat job terjadwal.

    Berikut contohnya:

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

    • Lihat pekerjaan terjadwal:

      SELECT * FROM sys.user_jobs;

      Berikut contoh output-nya:

       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
    • Lihat catatan eksekusi:

      SELECT * FROM dbmsjob.pga_joblog;

      Berikut contoh output-nya:

       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. Beralih ke database test dan lihat data di dalam tabel.

    Jalankan kueri berikut:

    SELECT * FROM jobrun;

    Berikut contoh output-nya:

     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

Untuk mengubah job lintas database, jalankan prosedur modifikasi dari database postgres dan tentukan nama database target. Misalnya, untuk mengubah jadwal job dari setiap menit menjadi setiap dua menit, jalankan perintah berikut:

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