2013-01-01 12 views
5

Mögliche Duplizieren:
Trigger based on sysdateEreignisse basierend auf sysdate

1.Ich haben einen Tisch, auf dem i Aktualisierungsoperationen jeden Tag um 12:00 Uhr ausführen müssen (. 24 Hr Format) .

Wie soll ich das erreichen?

Tabellenschema:

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

Update-Algorithmus:

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

Wie unterscheidet sich das von Ihrer [vorherigen Frage] (http://stackoverflow.com/questions/14110433/trigger-based-on-sysdate)? – Mat

+0

Das ist nicht klar: 'then total = admitdate-sysdate = Unterschied in Tagen * Total' – codingbiz

+0

Kannst du nicht einfach jeden Tag ein (zum Beispiel PHP) Skript ausführen? Mit dem PHP CLI sollte das nicht so schwer sein. – 11684

Antwort

1

Der Standard einen Job alle 24 Stunden wären zu laufen, einen Job in diesem Intervall DBMS_SCHEDULER mit dem System Paket auszuführen.

Zum Beispiel:

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; 
/

Sie dann eine Prozedur erstellen, auszuführen:

create or replace PROCEDURE my_procedure is 

begin 

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

end; 
/

Dies würde die Spalte Gesamt aktualisiert die Anzahl der Tage zwischen den admitdate und SYSDATE zu sein.

Allerdings, frage ich die Notwendigkeit, dies überhaupt zu tun. Es klingt sehr nach der uralten Frage "Soll ich Age speichern?". I believe the answer is no. Es kann passieren, dass Sie sich zu einem bestimmten Zeitpunkt irren und es gibt eine Reihe von Möglichkeiten, die dazu führen, dass der Job manuell falsch ausgeführt wird. Ich würde diese Spalte im laufenden Betrieb berechnen, während Sie Daten aus der Datenbank extrahieren.

+0

+1, für die Erwähnung des gesamten Konzepts der Speicherung von Alter. – davidethell

+0

@ Ben Wird diese Arbeit jeden Tag bekommt ausgeführt und wenn jeden Tag als zu welchem ​​Zeitpunkt – Akki

+0

Das am Mittag ausgeführt werden soll (die '+ 0.5' Teil) und täglich ausgeführt werden (' freq = daily'). Ich würde empfehlen, die verknüpfte Dokumentation zu lesen. Es ist ganz so kompliziert Blick auf [einige Beispiele] (http://www.oracle-base.com/articles/10g/scheduler-10g.php) kann auch hilfreich sein ... – Ben

0

Oracle hat keinen integrierten Scheduler. Es gibt ein paar verschiedene Möglichkeiten, dies anzugehen. Hier sind zwei:

1) Erstellen Sie ein SQL-Skript, das durch den Zeitplanungsmechanismus Ihres Servers ausgeführt wird. Für Unix/Linux wird dies ein Cron-Job sein. Für Windows ist dies eine geplante Aufgabe.

2) Erstellen Sie einen geplanten Auftrag der CREATE_JOB Syntax:

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

Sorry, ja, aber was ist, wenn System offline um 12:00 @davidethell – Akki

+0

Wenn das System um 12:00 @Akki offline ist, bist du Pech Pech, deshalb empfehle ich _not_ Speichern dieser Spalte überhaupt. – Ben

+0

@Akki, wenn Sie einen täglichen Job um 12 Uhr planen, dann ist es die Aufgabe des Server-Administrators, sicher zu sein, dass der Server online ist. – davidethell

0

Ausgedrückt als SQL, ich glaube, Ihr Algorithmus in der unten stehenden UPDATE Anweisung umgesetzt wird. Sie scheinen bei jedem Ausführen des Algorithmus total selbst zu multiplizieren. Ich nehme an, das ist mein Missverständnis oder dein Tippfehler. Es scheint sinnvoller zu sein, dass total einfach der Unterschied zwischen dem Zulassungsdatum und dem aktuellen Datum entspricht.

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

Um sicherzustellen, dass diese Abfrage effizient läuft, werden Sie einen Index über die DischargeDate Spalte haben wollen.

Um dies jeden Tag zu einer bestimmten Zeit zu tun, haben Sie ein paar Möglichkeiten.

Ein Ansatz, wenn Sie Ihren eigenen eigenen Servercode haben, ist, dass der Code die Arbeit plant und wann immer Sie möchten. Wenn Sie eine gute Überwachung und Verwaltung in Ihre serverseitige Architektur integriert haben.

Ein anderer Ansatz besteht darin, einen chron oder at Job auszuführen, je nachdem, welche Betriebssysteme Sie verwenden.

+1

Ich denke OP getaggt es 'ORACLE' ??/ – codingbiz

+0

was OP ist ?? @codingbiz – Akki

+0

OP bedeutet Original Post/Poster. In diesem Zusammenhang hat die Person die Frage gestellt. – codingbiz

Verwandte Themen