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.

  • 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