2013-01-01 10 views
5

Eventuali duplicati:
Trigger based on sysdateeventi sulla base di sysdate

1.I avere un tavolo su cui ho per eseguire operazioni di aggiornamento di tutti i giorni alle 12:00 (. 24 Ore Format) .

Come devo fare?

Tabella Schema:

CREATE TABLE CHARGES 
(
    total NUMBER(30), 
    admitdate TIMESTAMP(6), 
    dischargedate TIMESTAMP(30) 
) 

Algoritmo Aggiornamento:

if 
{ 
    dischargedate="null" 
    then total=admitdate-sysdate=difference in days * Total 
    Do this every day at 12:00(24 Hr. Format) 
} 
else 
{ 
    do nothing.  
} 
+0

In che modo è diverso dalla [domanda precedente] (http://stackoverflow.com/questions/14110433/trigger-based-on-sysdate)? – Mat

+0

questo non è chiaro: 'then totale = admitdate-sysdate = differenza in giorni * Totale' – codingbiz

+0

Non puoi eseguire uno script (ad esempio PHP) ogni giorno? Con la CLI PHP che non dovrebbe essere così difficile. – 11684

risposta

1

Lo standard per eseguire un processo ogni 24 ore sarebbe per eseguire un processo di questo intervallo utilizzando il pacchetto di sistema DBMS_SCHEDULER.

Per esempio:

BEGIN 
    DBMS_SCHEDULER.create_job (
    job_name  => 'update_charges', 
    job_type  => 'PLSQL_BLOCK', 
    job_action  => 'BEGIN my_procedure; END;', 
    start_date  => TRUNC(SYSDATE) + 0.5, 
    repeat_interval => 'freq=daily;', 
    end_date  => NULL, 
    enabled   => TRUE, 
    comments  => 'Update the discharged date in charges.'); 
END; 
/

Si crea quindi una procedura per eseguire:

create or replace PROCEDURE my_procedure is 

begin 

    update charges 
    set total = admitdate - sysdate 
    where dischargedate is null; 

end; 
/

Ciò aggiorna il totale della colonna di essere il numero di giorni tra la admitdate e SYSDATE.

Tuttavia,, dubito della necessità di fare questo. Sembra molto simile alla vecchia domanda "Devo memorizzare l'età". I believe the answer is no. Ad un certo punto si è assolutamente obbligati a sbagliare e ci sono diverse possibilità che potrebbero causare l'esecuzione manuale del lavoro in modo errato. Vorrei calcolare questa colonna al volo mentre estrai i dati dal database.

+0

+1, per menzionare l'intero concetto di memorizzazione dell'età. – davidethell

+0

@Ben Questo lavoro viene eseguito ogni giorno e ogni giorno rispetto a che ora – Akki

+0

Questo dovrebbe essere eseguito a mezzogiorno (la parte '+ 0.5') ed essere eseguito ogni giorno (' freq = daily'). Raccomanderei comunque di leggere la documentazione collegata. È piuttosto complicato, quindi è utile guardare alcuni esempi (http://www.oracle-base.com/articles/10g/scheduler-10g.php) ... – Ben

0

Oracle non dispone di un programmatore incorporato. Esistono diversi modi per affrontarlo. Eccone due:

1) Creare uno script SQL eseguito attraverso il meccanismo di pianificazione del server. Per Unix/Linux questo sarà un lavoro cron. Per Windows questa sarà un'attività pianificata.

2) Creare un processo pianificato utilizzando la sintassi CREATE_JOB:

BEGIN 
DBMS_SCHEDULER.CREATE_JOB (
    job_name   => 'update_charges', 
    job_type   => 'STORED_PROCEDURE', 
    job_action   => 'MYSCHEMA.SOME_PKG.UPDATE_CHARGES', 
    start_date   => '28-APR-08 12.00.00 PM Australia/Sydney', 
    repeat_interval => 'FREQ=DAILY;INTERVAL=1', /* every other day */ 
    end_date   => '20-NOV-13 12.00.00 PM Australia/Sydney', 
    job_class   => 'batch_update_jobs', 
    comments   => 'My new job'); 
END; 
+0

Scusa, sì, ma se il sistema è non in linea alle 12:00 @davidethell – Akki

+0

Se il sistema è offline alle 12:00 @Akki, sei puro sfortunato, ecco perché suggerisco di non memorizzare affatto questa colonna. – Ben

+0

@Akki, se si pianifica un lavoro giornaliero alle 12:00, è compito dell'amministratore del server assicurarsi che il server sia online. – davidethell

0

Espresso in SQL, credo che l'algoritmo è implementato nel UPDATE seguente dichiarazione. Sembra che voglia moltiplicare lo total da solo ogni volta che viene eseguito l'algoritmo; Suppongo che sia il mio fraintendimento o il tuo errore di battitura. Sembra più logico che total equivalga semplicemente alla differenza tra la data di ammissione e quella attuale.

UPDATE CHARGES 
    SET Total = DATEDIFF(d, GETDATE(), AdmitDate) 
WHERE DischargeDate IS NULL; 

per assicurarsi che questa query viene eseguita in modo efficiente, si vorrà avere un indice sopra la colonna DischargeDate.

Per fare ciò ogni giorno ad una certa ora, hai alcune scelte.

Un approccio, se si dispone del proprio codice server in esecuzione proprio, è di avere quel codice pianificare il lavoro ed eseguirlo quando lo si desidera. Se hai un buon monitoraggio e gestione integrati nella tua architettura lato server.

Un altro approccio è eseguire un lavoro chron o at, a seconda dei sistemi operativi che si stanno utilizzando.

+1

Penso che OP l'abbia taggato 'ORACLE'// – codingbiz

+0

cos'è OP? @codingbiz – Akki

+0

OP significa post originale/poster. In questo contesto, è la persona che ha posto la domanda. – codingbiz