1. Schemaläggning av PL/SQL
När man schemalägger en process är det vanligt att man låter operativsystemet ta hand om saken, i Unix använder man t.ex. Cron för att schemalägga arbeten. Om du via Cron vill starta en PL/SQL-procedur måste du då starta ett annat program (t.ex. ett Shell-script) som i sin tur drar igång PL/SQL-proceduren. Ett alternativ till detta är att låta Oracle ta hand om schemaläggningen genom att använda paketet DBMS_JOBS.
- OBS: Från och med Oracle 10g är DBMS_JOBS ersatt med DBMS_SCHEDULER.
Nedan visas ett exempel på hur man schedulerar proceduren "PROC_LOGGER" att köra en gång i timmen med första körningen just nu:
SQL> DBMS_JOB.SUBMIT (
:jobno
,'proc_logger;'
,SYSDATE
,'SYSDATE+1/24');
/
|
Detta är definitionen av DBMS_JOB.SUBMIT:
dbms_job.submit(
JOB OUT BINARY_INTEGER,
WHAT IN VARCHAR2,
NEXT_DATE IN DATE DEFAULT SYSDATE,
INTERVAL IN VARCHAR2 DEFAULT 'NULL',
NO_PARSE IN BOOLEAN DEFAULT FALSE,
INSTANCE IN BINARY_INTEGER DEFAULT ANY_INSTANCE,
FORCE IN BOOLEAN DEFAULT FALSE);
|
Förklaringen på vad inparametrarna betyder är som följer:
- JOB An output parameter, this is the identifier assigned to the job you created. You must use this job number whenever you want to alter or remove the job.
- WHAT This is the PL/SQL code you want to have executed. The WHAT parameter must end with a semi-colon.
- NEXT_DATE The next date when the job will be run. The default value is SYSDATE.
- INTERVAL The date function that calculates the next time to execute the job. The default value is NULL. INTERVAL must evaluate to a future point in time or NULL. This parameter is a VARCHAR2 and must be enclosed in single quotes.
- NO_PARSE This is a flag. If NO_PARSE is set to FALSE (the default), Oracle parses the procedure associated with the job. If NO_PARSE is set to TRUE, Oracle parses the procedure associated with the job the first time that the job is executed. If, for example, you want to submit a job before you have created the tables associated with the job, set NO_PARSE to TRUE.
2. Schemalägga med intervall
Den enklaste typen av schemaläggning är att sätta INTERVAL-kolumnen till något av dessa värden:
Intervall | | Beskrivning |
SYSDATE + 1 | | Exekvera dagligen. |
SYSDATE + 1/24 | | Exekvera varje timma. |
SYSDATE + 10/1440 | | Exekvera var 10-nde minut. |
SYSDATE + 30/86400 | | Exekvera var 30-nde sekund. |
SYSDATE + 7 | | Exekvera en gång i veckan. |
NULL | | Exekvera inte alls och ta bort ur listan. |
Om du läggar in din schemaläggning klockan 13:42 med "SYSDATE +1" kommer nästa körning troligtvis ske imorgon samma tid, men Oracle garanterar bara att det kommer gå MINST en dag tills nästa körning, tiden kan nämligen förskjutas. Problemet med denna typ av schemaläggning är att Oracle byter klockslag under vissa omständigheter. Om du t.ex. manuellt kör proceduren med DBMS_JOB.RUN kommer Oracle se detta som en körning och vänta hela intervallet ut tills nästa körning, något som orsakar en förskjutning. För att komma runt dessa problem kan du sätta INTERVAL på detta sätt:
Intervall | | Beskrivning |
TRUNC(SYSDATE + 1) | | Exekvera dagligen kl 00:00. |
TRUNC(SYSDATE + 1) + 8/24 | | Exekvera dagligen kl 8:00. |
NEXT_DAY(TRUNC(SYSDATE ), "TUESDAY" ) + 12/24 | | Exekvera varje tisdag kl 12:00. |
TRUNC(LAST_DAY(SYSDATE ) + 1) | | Exekvera månadens första dag kl 00:00. |
3. USER_JOBS
Genom att fråga tabellen USER_JOBS kan du se vilka jobb som ligger schemalagda:
SQL> DESC USER_JOBS;
Name Null? Type
----------------------------------------- -------- ----------------------------
JOB NOT NULL NUMBER
LOG_USER NOT NULL VARCHAR2(30)
PRIV_USER NOT NULL VARCHAR2(30)
SCHEMA_USER NOT NULL VARCHAR2(30)
LAST_DATE DATE
LAST_SEC VARCHAR2(8)
THIS_DATE DATE
THIS_SEC VARCHAR2(8)
NEXT_DATE NOT NULL DATE
NEXT_SEC VARCHAR2(8)
TOTAL_TIME NUMBER
BROKEN VARCHAR2(1)
INTERVAL NOT NULL VARCHAR2(200)
FAILURES NUMBER
WHAT VARCHAR2(4000)
NLS_ENV VARCHAR2(4000)
MISC_ENV RAW(32)
INSTANCE NUMBER
|
Vi tittar på de jobb som ligger upplagda nu:
SQL> SELECT what, job, total_time, broken, interval FROM user_jobs;
WHAT JOB TOTAL_TIME B INTERVAL
-------------------------------- ---------- ---------- - ----------------------------------------
CalculateAllTurnoverLastMonth; 62 11162 N add_months(trunc(sysdate,'MM'),1)+1/24
Runyesterday; 41 1218911 N TRUNC(SYSDATE) +1 + 00/24
OLDX_Runyesterday; 81 692247 Y TRUNC(SYSDATE) +1 + 01/24
|
4. DBA_JOBS_RUNNING
Med DBA_JOBS_RUNNING kan man se vilka jobb som kör just nu:
SQL> desc dba_jobs_running;
Name Null? Type
----------------------------- -------- --------------------
SID NUMBER
JOB NUMBER
FAILURES NUMBER
LAST_DATE DATE
LAST_SEC VARCHAR2(8)
THIS_DATE DATE
THIS_SEC VARCHAR2(8)
INSTANCE NUMBER
|