2013-01-01 17 views
5

संभव डुप्लिकेट:
Trigger based on sysdateघटनाक्रम

1.I मैं 12:00 (। 24 Hr स्वरूप) पर हर रोज अद्यतन कार्रवाई करने के लिए है, जिस पर एक मेज है ।

मुझे इसे कैसे पूरा करना चाहिए?

तालिका स्कीमा:

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

अद्यतन एल्गोरिथ्म:

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

यह आपके [पिछले प्रश्न] (http://stackoverflow.com/questions/14110433/trigger-based-on-sysdate) से अलग कैसे है? – Mat

+0

यह स्पष्ट नहीं है: 'तो कुल = admitdate-sysdate = दिनों में अंतर * कुल' – codingbiz

+0

क्या आप प्रतिदिन केवल (उदाहरण के लिए PHP) स्क्रिप्ट नहीं चला सकते हैं? PHP सीएलआई के साथ जो मुश्किल नहीं होना चाहिए। – 11684

उत्तर

1

मानक एक नौकरी हर 24 घंटे में इस अंतराल प्रणाली पैकेज DBMS_SCHEDULER का उपयोग कर में नौकरी को चलाने के लिए किया जाएगा चलाने के लिए।

उदाहरण के लिए:

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

फिर आप को चलाने के लिए एक प्रक्रिया बनाने के लिए:

create or replace PROCEDURE my_procedure is 

begin 

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

end; 
/

यह कॉलम कुल अपडेट करेंगे admitdate और SYSDATE बीच दिनों की संख्या होने के लिए।

हालांकि, मुझे यह करने की आवश्यकता पर सवाल उठता है। यह उम्र के पुराने "मुझे उम्र संग्रहित करना चाहिए" प्रश्न की तरह बहुत लगता है। I believe the answer is no. आप किसी बिंदु पर बिल्कुल गलत होने के लिए बाध्य हैं और ऐसी कई संभावनाएं हैं जो नौकरी को मैन्युअल रूप से गलत तरीके से चलाने का कारण बन सकती हैं। जब आप डेटाबेस से डेटा निकालते हैं तो मैं इस कॉलम को फ्लाई पर गणना करूंगा।

+0

+1, उम्र संग्रहित करने की पूरी अवधारणा का जिक्र करने के लिए। – davidethell

+0

@ बेन यह नौकरी रोज़ाना निष्पादित की जाएगी और यदि – Akki

+0

पर रोज़ाना यह रोजाना (दो + 0.5' भाग) पर निष्पादित होना चाहिए और दैनिक ('freq = दैनिक') निष्पादित किया जाना चाहिए। हालांकि मैं अत्यधिक लिंक्ड दस्तावेज पढ़ने की सिफारिश करता हूं। यह काफी जटिल है [कुछ उदाहरण] (http://www.oracle-base.com/articles/10g/scheduler-10g.php) को भी मददगार हो सकता है ... – Ben

0

ओरेकल में शेड्यूलर में निर्मित नहीं है। इससे निपटने के कुछ अलग तरीके हैं। यहां दो हैं:

1) एक एसक्यूएल स्क्रिप्ट बनाएं जो आपके सर्वर के शेड्यूलिंग तंत्र के माध्यम से चलती है। यूनिक्स/लिनक्स के लिए यह एक क्रॉन नौकरी होगी। विंडोज के लिए यह अनुसूचित कार्य होगा।

2) 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

क्षमा करें, हाँ, लेकिन अगर सिस्टम है ऑफ़लाइन 12:00 @ डेविडेटहेल – Akki

+0

यदि सिस्टम 12:00 @ अक्की पर ऑफ़लाइन है, तो आप भाग्य से शुद्ध हैं, इसलिए मैं इस कॉलम को _not_ संग्रहीत करने का सुझाव देता हूं। – Ben

+0

@Akki, यदि आप 12 पीएम पर दैनिक नौकरी निर्धारित कर रहे हैं तो यह सुनिश्चित करने के लिए सर्वर व्यवस्थापक का काम है कि सर्वर ऑनलाइन है। – davidethell

0

एसक्यूएल के रूप में व्यक्त किया, मैं अपने एल्गोरिथ्म नीचे UPDATE बयान में कार्यान्वित किया जाता है लगता है। आप प्रत्येक बार अपने एल्गोरिदम चलाते समय total गुणा करना चाहते हैं; मुझे लगता है कि यह मेरी गलतफहमी या आपका टाइपो है। ऐसा लगता है कि total बस प्रवेश दिनांक और वर्तमान तिथि के बीच अंतर के बराबर है।

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

आप DischargeDate स्तंभ पर एक सूचकांक के लिए करना होगा कि इस क्वेरी कुशलता से चलाता है बनाने के लिए,।

यह हर दिन एक निश्चित समय पर करने के लिए, आपके पास कुछ विकल्प हैं।

एक दृष्टिकोण, यदि आपके पास अपना स्वयं का सर्वर कोड स्वयं चल रहा है, तो वह कोड उस कार्य को शेड्यूल करना होगा और जब चाहें इसे निष्पादित करना होगा। यदि आपके पास सर्वर-साइड आर्किटेक्चर में अच्छी निगरानी और प्रबंधन है।

एक और तरीका chron या at नौकरी चलाने के लिए है, जो आप उपयोग कर रहे हैं ओएसई के आधार पर।

+1

मुझे लगता है कि ओपी ने इसे 'ओरेकल' टैग किया है ??/ – codingbiz

+0

ओपी क्या है ?? @ कोडिंगबिज – Akki

+0

ओपी का मतलब मूल पोस्ट/पोस्टर है। इस संदर्भ में, यह वह व्यक्ति है जिसने प्रश्न पूछा। – codingbiz

संबंधित मुद्दे