PolarDB provides the DBMS_JOB extension that is used to schedule and manage scheduled jobs. This topic describes how to create, manage, and delete a scheduled job.
Prerequisites
The kernel version of your PolarDB cluster is 1.1.7 or later.Release notes.
NoteYou can execute the following statement to query the revision version of your PolarDB for PostgreSQL (Compatible with Oracle) cluster.
SHOW polar_version;
For security reasons, you cannot manually create the DBMS_JOB extension. To create the DBMS_JOB extension, contact us.
Usage notes
Only privileged accounts can use the DBMS_JOB extension. For more information about how to create a privileged account, see Create a database account.
You can create the dbms_job extension in only the
postgres
database. If you want to configure scheduled jobs for other databases, configure cross-database scheduled jobs in thepostgres
database. For more information, see Run a scheduled job across databases.
Prepare test data
The test data applies only to the examples that are provided in this topic.
Create a table named jobrun
for testing, as shown in the following example:
CREATE TABLE jobrun (
id serial NOT NULL PRIMARY KEY,
runtime VARCHAR2(40)
);
Create a stored procedure named job_proc
, as shown in the following example:
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;
Delete the DBMS_JOB extension
If you delete the DBMS_JOB extension, all the existing user jobs that are related to the DBMS_JOB extension are deleted.
The following syntax can be used to delete the DBMS_JOB extension:
DROP EXTENSION dbms_job CASCADE;
Create a scheduled job
Syntax
SUBMIT(job OUT BINARY_INTEGER, what VARCHAR2
[, next_date DATE [, interval VARCHAR2 ]])
Table 1. Parameters
Parameter | Description |
| The |
| The name of the stored procedure that you want to call. You must specify this parameter. The |
| The start time of the scheduled job. If you do not specify this parameter, the current time is automatically used. |
| The interval at which the scheduled job is run. For more information, see Interval description. |
Table 2. Interval description
Execution interval | Example |
Every minute |
|
Every day | The system runs the job at 01:00:00 every day:
|
Every week | The system runs the job at 01:00:00 on every Monday:
|
Every month | The system runs the job at 01:00:00 on the first day of every month:
|
Every quarter | The system runs the job at 01:00:00 on the first day of every quarter:
|
Every year | The system runs the job at 01:00:00 on January 1 every year:
|
Fixed point in time | The system runs the job at 08:10:00 every morning:
|
Fixed interval | The system runs the job at the fifteenth minute of every hour, such as 08:15:00, 09:15:00, and 10:15:00.
|
Call the job_proc
stored procedure to create a scheduled job, as shown in the following example:
DECLARE
jobid INTEGER;
BEGIN
DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24 * 60)');
END;
If you use single quotation marks when you create scheduled jobs, nested quotations are created in the statement. This can result in a syntax error. The following sample statement provides an example:
DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'TRUNC(sysdate,'mi') + 1/(24*60)');
You must enclose the corresponding parameter values in $$
symbols to prevent this error, as shown in the following example:
DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, $$TRUNC(sysdate,'mi') + 1/(24*60)$$);
Query scheduled jobs
You can execute the following statement to query the scheduled jobs created by the current user:
SELECT * FROM sys.user_jobs;
Modify the content, start time, and execution interval of a scheduled job
Syntax
CHANGE(job BINARY_INTEGER what VARCHAR2, next_date DATE,interval VARCHAR2)
Table 3. Parameters
Parameter | Description |
| The job ID. For more information about how to check the job ID, see Query scheduled jobs. |
| The name of the stored procedure that you want to call. Note If you want to use the current value, set this parameter to |
| The start time of the scheduled job. Note If you want to use the current value, set this parameter to |
| The interval at which the scheduled job is run. For more information, see Interval description. Note If you want to use the current value, set this parameter to |
Assume that you want to modify the scheduled job whose job ID is 1 with the stored procedure unchanged. You also want to change the start time of the scheduled job to December 29, 2020 and run the job at the fifteenth minute of every hour. The following sample statement provides an example:
BEGIN
DBMS_JOB.CHANGE(1,NULL,TO_DATE('29-DEC-20','DD-MON-YY'),$$Trunc(sysdate,'hh') + (60+15)/(24*60)$$);
END;
Modify the execution interval of a scheduled job
Syntax
INTERVAL(job BINARY_INTEGER, interval VARCHAR2)
Table 4. Parameters
Parameter | Description |
| The job ID. For more information about how to check the job ID, see Query scheduled jobs. |
| The interval at which the scheduled job is run. For more information, see Interval description. |
Assume that you want to modify the scheduled job whose job ID is 1. You want to set the interval to run the job at 01:00:00 every day. The following sample statement provides an example:
BEGIN
DBMS_JOB.INTERVAL(1,'TRUNC(sysdate) + 1 + 1/(24)');
END;
Modify the start time of a scheduled job
Syntax
NEXT_DATE(job BINARY_INTEGER, next_date DATE)
Table 5. Parameters
Parameter | Description |
| The job ID. For more information about how to check the job ID, see Query scheduled jobs. |
| The start time of the scheduled job. |
Assume that you want to modify the scheduled job whose job ID is 1. You want to set the start time of the scheduled job to December 30, 2020. The following sample statement provides an example:
BEGIN
DBMS_JOB.NEXT_DATE(1, TO_DATE('30-DEC-20','DD-MON-YY'));
END;
Modify the content of a scheduled job
Syntax
WHAT(job BINARY_INTEGER, what VARCHAR2)
Table 6. Parameters
Parameter | Description |
| The job ID. For more information about how to check the job ID, see Query scheduled jobs. |
| The name of the stored procedure that you want to call. |
Assume that you want to modify the scheduled job whose job ID is 1. You want to change the stored procedure to job_proc2
. The following sample statement provides an example:
BEGIN
DBMS_JOB.WHAT(1,'job_proc2');
END;
Stop and start a scheduled job
Syntax
BROKEN(job BINARY_INTEGER, broken BOOLEAN [, next_date DATE ])
Table 7. Parameters
Parameter | Description |
| The job ID. For more information about how to check the job ID, see Query scheduled jobs. |
| The state of the scheduled job. Valid values:
|
| The start time of the scheduled job. If you do not specify this parameter, the current time is automatically used. |
Specify the state of the scheduled job whose job ID is 1 as abnormal. The following sample statement provides an example:
BEGIN
DBMS_JOB.BROKEN(1,true);
END;
Specify the state of the scheduled job whose job ID is 1 as normal. The following sample statement provides an example:
BEGIN
DBMS_JOB.BROKEN(1,false);
END;
Force a scheduled job to run
Syntax
RUN(job BINARY_INTEGER)
Table 8. Parameters
Parameter | Description |
| The job ID. For more information about how to check the job ID, see Query scheduled jobs. |
Force the scheduled job whose job ID is 1 to run. The following sample statement provides an example:
BEGIN
DBMS_JOB.RUN(1);
END;
If an error message similar to the following one is returned after you use a client tool to connect to the database and execute the preceding statement, the client tool is not supported. Use PolarDB-Tools instead. For more information, see 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
Delete a scheduled task
Syntax
REMOVE(job BINARY_INTEGER)
Table 9. Parameters
Parameter | Description |
| The job ID. For more information about how to check the job ID, see Query scheduled jobs. |
Delete the scheduled job whose job ID is 1. The following sample statement provides an example:
BEGIN
DBMS_JOB.REMOVE(1);
END;
Query the execution records of a scheduled job
You can execute the following statement to query the execution records of your scheduled jobs:
SELECT * FROM dbmsjob.pga_joblog;
Run a scheduled job across databases
The DBMS_JOB extension applies only to the postgres
database. If you want to configure scheduled jobs for other databases, configure cross-database scheduled jobs in the postgres database.
An example is used to describe how to configure a cross-database scheduled job. In this example, the DBMS_JOB extension is configured in the postgres
database. A scheduled job is configured to run in a database named test
. In this example, you want to insert one data record per minute into a table in the test
database. For more information about how to create a database, see Create a database.
Create a table named
jobrun
and a stored procedure namedjob_proc
in thetest
database.Execute the following statement to create a table named
jobrun
:CREATE TABLE public.jobrun ( id serial NOT NULL PRIMARY KEY, runtime VARCHAR2(40) );
Execute the following statement to create a stored procedure named
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;
Create a scheduled job in the
postgres
database.You must add the database in which you want to run the scheduled job to the
DBMS_JOB.SUBMIT()
function. In this example, the database in which the scheduled job runs is namedtest
. For more information about other parameters, see Create a scheduled job.The following sample statement provides an example:
DECLARE jobid INTEGER; BEGIN DBMS_JOB.SUBMIT(jobid,'job_proc;', SYSDATE, 'SYSDATE + 1/(24 * 60)','test'); END;
Query the state and execution records of the scheduled job in the
postgres
database.Query the scheduled job:
SELECT * FROM sys.user_jobs;
The following output is returned:
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
Query the execution records:
SELECT * FROM dbmsjob.pga_joblog;
The following output is returned:
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
Query the data in the jobrun table in the
test
database.Execute the following statement:
SELECT * FROM jobrun;
The following output is returned:
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
If you want to modify the information about a cross-database scheduled job, you must add the name of the postgres
database in which you want to run the scheduled job when you modify the function. For example, if you want to change the execution interval from every minute in the preceding example to every two minutes, execute the following statement:
BEGIN
DBMS_JOB.CHANGE(1,NULL,SYSDATE,'SYSDATE + 1/(24 * 30)','test');
END;