programmera.net -> oracledba -> normal för utskrift | info@programmera.net |
Schemaläggning av PL/SQL
1. Schemaläggning av PL/SQL 2. Schemalägga med intervall 3. USER_JOBS 4. DBA_JOBS_RUNNING |
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.
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:
Detta är definitionen av DBMS_JOB.SUBMIT:
SQL> DBMS_JOB.SUBMIT (
:jobno
,'proc_logger;'
,SYSDATE
,'SYSDATE+1/24');
/
Förklaringen på vad inparametrarna betyder är som följer:
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);
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:
Vi tittar på de jobb som ligger upplagda nu:
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
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