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.
CatatanUntuk 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 databasepostgres. Untuk detail lebih lanjut, lihat Jalankan Tugas Terjadwal Lintas-Databse.
Siapkan data uji
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
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 |
| Nilai |
| Nama prosedur tersimpan yang ingin Anda panggil. Anda harus menentukan parameter ini. Prosedur tersimpan |
| Waktu mulai tugas terjadwal. Jika Anda tidak menentukan parameter ini, waktu saat ini akan digunakan secara otomatis. |
| Interval di mana tugas terjadwal dijalankan. Untuk informasi lebih lanjut, lihat Deskripsi interval. |
Tabel 2. Deskripsi Interval
Interval eksekusi | Contoh |
Setiap menit | |
Setiap hari | Sistem menjalankan tugas pada pukul 01:00:00 setiap hari: |
Setiap minggu | Sistem menjalankan tugas pada pukul 01:00:00 setiap hari Senin: |
Setiap bulan | Sistem menjalankan tugas pada pukul 01:00:00 pada hari pertama setiap bulan: |
Setiap kuartal | Sistem menjalankan tugas pada pukul 01:00:00 pada hari pertama setiap kuartal: |
Setiap tahun | Sistem menjalankan tugas pada pukul 01:00:00 pada tanggal 1 Januari setiap tahun: |
Titik tetap dalam waktu | Sistem menjalankan tugas pada pukul 08:10:00 setiap pagi: |
Interval tetap | Sistem menjalankan tugas pada menit kelima belas setiap jam, seperti 08:15:00, 09:15:00, dan 10:15:00. |
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;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 |
| ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal. |
| Nama prosedur tersimpan yang ingin Anda panggil. Catatan Jika Anda ingin menggunakan nilai saat ini, atur parameter ini ke |
| Waktu mulai tugas terjadwal. Catatan Jika Anda ingin menggunakan nilai saat ini, atur parameter ini ke |
| 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 |
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 |
| ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal. |
| 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 |
| ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal. |
| 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 |
| ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal. |
| 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 |
| ID tugas. Untuk informasi lebih lanjut tentang cara memeriksa ID tugas, lihat Kueri tugas terjadwal. |
| Keadaan tugas terjadwal. Nilai yang valid:
|
| 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 |
| 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;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 bodyHapus tugas terjadwal
Syntax
REMOVE(job BINARY_INTEGER)Tabel 9. Parameter
Parameter | Deskripsi |
| 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.
Buat tabel bernama
jobrundan prosedur tersimpan bernamajob_procdi dalam databasetest.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;
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 bernamatest. 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;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 | 0Kueri 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
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
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;