2013-01-01 22 views
5

Powiel możliwe:
Trigger based on sysdatewydarzenia na podstawie SYSDATE

1.I mieć stolik, na którym muszę wykonywać operacje aktualizacji codziennie o 12:00 (do 24 h. Format) .

Jak powinienem to zrobić?

tabeli schematu:

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

Aktualizacja Algorytm:

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

Czym różni się to od [poprzedniego pytania] (http://stackoverflow.com/questions/14110433/trigger-based-on-sysdate)? – Mat

+0

nie jest to jasne: 'then total = admitdate-sysdate = różnica w dniach * Total' – codingbiz

+0

Czy nie możesz uruchomić skryptu (na przykład PHP) każdego dnia? Z interfejsem PHP CLI, który nie powinien być aż tak trudny. – 11684

Odpowiedz

1

Standardowa aby uruchomić zadanie co 24 godziny byłoby uruchomić pracę w tym przedziale przy użyciu pakietu systemowego DBMS_SCHEDULER.

Na przykład:

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

Następnie stworzyć procedurę, aby uruchomić:

create or replace PROCEDURE my_procedure is 

begin 

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

end; 
/

Byłoby to aktualizować sumy kolumny, aby być liczba dni pomiędzy admitdate i SYSDATE.

Jednak kwestionuję, że muszę to zrobić w ogóle. Brzmi bardzo podobnie do staroświeckiego pytania "Czy powinienem przechowywać wiek". I believe the answer is no. Jesteś absolutnie zobowiązany do bycia w błędzie w pewnym momencie i istnieje wiele możliwości, które mogą spowodować nieprawidłowe uruchomienie zadania. Obliczyłbym tę kolumnę w locie podczas wyodrębniania danych z bazy danych.

+0

+1, ponieważ wspomniałem o całej koncepcji przechowywania wieku. – davidethell

+0

@Ben Czy to zadanie zostanie wykonane codziennie i codziennie niż w jakim czasie? – Akki

+0

Powinno to zostać wykonane w południe (część '+ 0,5') i być wykonywane codziennie (' freq = daily'). Gorąco polecam lekturę połączonej dokumentacji. Jest to dość skomplikowane, więc spojrzenie na [kilka przykładów] (http://www.oracle-base.com/articles/10g/scheduler-10g.php) też może być pomocne ... – Ben

0

Oracle nie ma wbudowanego programu planującego. Istnieje kilka różnych sposobów rozwiązania tego problemu. Oto dwa:

1) Utwórz skrypt sql uruchamiany przez mechanizm szeregowania serwera. W systemie Unix/Linux będzie to zadanie typu cron. W przypadku Windows będzie to Zaplanowane zadanie.

2) Tworzenie zaplanowanego zadania przy użyciu składni 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

Przepraszam, tak, ale co jeśli system jest offline o 12:00 @davidethell – Akki

+0

Jeśli system jest w trybie offline o 12:00 @Akki, masz pecha, dlatego sugeruję _nie_ przechowywanie tej kolumny w ogóle. – Ben

+0

@Akki, jeśli planujesz codzienne zadanie o 12.00, to zadaniem administratora serwera jest upewnienie się, że serwer jest podłączony do sieci. – davidethell

0

Wyrażone jako SQL, myślę, że algorytm jest realizowany w rachunku UPDATE poniżej. Wydaje się, że chcesz rozmnażać total przez siebie za każdym razem, gdy działa algorytm; Zakładam, że to moje nieporozumienie lub twoja literówka. Wydaje się, że bardziej sensowne jest to, że total po prostu równa się różnicy między datą przyjęcia a bieżącą datą.

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

Aby upewnić się, ta kwerenda działa sprawnie, będziemy chcieli, aby mieć indeks nad kolumną DischargeDate.

Aby zrobić to codziennie o określonej godzinie, masz kilka możliwości.

Jednym podejściem, jeśli posiadasz swój własny kod serwera, jest zaprogramowanie go i wykonanie go, kiedy tylko chcesz. Jeśli masz dobre monitorowanie i zarządzanie wbudowane w architekturę po stronie serwera.

Innym podejściem jest uruchamianie zadania chron lub at, w zależności od używanych systemów operacyjnych.

+1

Myślę, że OP oznacza to 'ORACLE' ??/ – codingbiz

+0

co to jest OP? @codingbiz – Akki

+0

OP oznacza oryginalny post/plakat. W tym kontekście jest to osoba, która zadała pytanie. – codingbiz