2016-12-26 9 views
5

मैं अगले कार्यक्रम और बाद में ओरेकल नौकरी बनाया है:कई उदाहरण में चलाने के लिए एक async ओरेकल काम कैसे बनाएं

BEGIN 
    DBMS_SCHEDULER.create_program (program_name   => 'myProg', 
            program_action  => 'myProc', 
            program_type   => 'STORED_PROCEDURE', 
            number_of_arguments => 3, 
            enabled    => FALSE); 

    DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (program_name  => 'myProg', 
              argument_position => 1, 
              argument_type  => 'NUMBER'); 

    DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (program_name  => 'myProg', 
              argument_position => 2, 
              argument_type  => 'NUMBER'); 

    DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (program_name  => 'myProg', 
              argument_position => 3, 
              argument_type  => 'NUMBER', 
              DEFAULT_VALUE  => NULL); 

    DBMS_SCHEDULER.create_job ('myJob', 
           program_name => 'myProg', 
           enabled  => FALSE, 
           comments  => 'Send data'); 

    DBMS_SCHEDULER.SET_ATTRIBUTE ('myJob', 'PARALLEL_INSTANCES', TRUE); 
    DBMS_SCHEDULER.SET_ATTRIBUTE ('myJob', 
           'logging_level', 
           DBMS_SCHEDULER.LOGGING_FULL); 
END; 
/

अब, मैं किसी ऐसे उपयोगकर्ता को चला सकते हैं/कि अगली प्रक्रिया कॉल पर अमल का काम करते हैं :

PROCEDURE runJOB(param1 IN PLS_INTEGER, 
        param2 IN PLS_INTEGER DEFAULT NULL, 
        param3 IN PLS_INTEGER DEFAULT NULL) 
IS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
    DBMS_SCHEDULER.enable ('myProg'); 

    DBMS_SCHEDULER.set_job_argument_value ('myJob', 1, TO_CHAR (param1)); 
    DBMS_SCHEDULER.set_job_argument_value ('myJob', 2, TO_CHAR (param2)); 
    DBMS_SCHEDULER.set_job_argument_value ('myJob', 3, TO_CHAR (param3)); 
    --DBMS_SCHEDULER.enable ('myJob'); 
    DBMS_SCHEDULER.RUN_JOB (JOB_NAME => 'myJob', USE_CURRENT_SESSION => FALSE); 
--DBMS_SCHEDULER.disable ('myJob'); 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.put_line (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
END runJOB; 

यहां मेरी समस्याएं क्या हैं?

  • मुझे नौकरी को अतुल्यकालिक मोड में चलाने की आवश्यकता है। यही कारण है कि मेरे पास enable या run_jobUSE_CURRENT_SESSION पैरामीटर FALSE का उपयोग कर रहा है। मुझे लगता है कि यह काम करता है।
  • मुझे एक ही समय में विभिन्न उपयोगकर्ताओं द्वारा शुरू की जाने वाली एक ही नौकरी के कई उदाहरण निष्पादित करने की आवश्यकता है। उदाहरण के लिए, उपयोगकर्ता ए runJOB प्रक्रिया को कॉल करता है। नौकरी 20 सेकंड में चल सकती है। इस 20 सेकेंड में, उपयोगकर्ता बी एक अलग सत्र में, एक ही प्रक्रिया को कॉल कर सकता है। यही कारण है कि मैंने PARALLEL_INSTANCES विशेषता का उपयोग करने का प्रयास किया है, लेकिन मुझे केवल एक निष्पादन मिलता है। मुझे लगता है कि ओरेकल देखता है कि नौकरी चल रही है, इसलिए चलाने के दूसरे प्रयास को छोड़ दें।

फिर से शुरू करने में, मुझे नौकरी की आवश्यकता है जिसे एक ही समय में एसिंक मोड में निष्पादित किया जाना चाहिए और कई उदाहरणों के साथ।

दो उदाहरणों के लिए काम का एक "डबल" निष्पादन मैं केवल user_SCHEDULER_JOB_RUN_DETAILS तालिका में एक रिकॉर्ड प्राप्त करने के बाद, लेकिन 2 सक्षम काम के दो अलग-अलग उपयोगकर्ताओं (SGSS और EX01882_BD)

52367532 26/12/2016 12:08:44,584878 +00:00 SGSS myJob DEFAULT_JOB_CLASS RUN SUCCEEDED        (HugeClob) 
52364238 26/12/2016 12:08:36,529539 +00:00 SGSS myJob DEFAULT_JOB_CLASS ENABLE  EX01882_BD       (HUGECLOB) 
52367534 26/12/2016 12:08:34,302807 +00:00 SGSS myJob DEFAULT_JOB_CLASS ENABLE  SGSS       (HUGECLOB) 

किसी भी मदद के लिए?

नोट: मैं, इस समाधान (How run two or more instances of an oracle job in the same time?) में के रूप में काम के अलग-अलग नाम नहीं हो सकता है क्योंकि काम पहले से ही बनाई गई है और उपयोगकर्ताओं को, जो इस काम के फोन बनाने की अनुमति नहीं है।

उत्तर

1

समाधान: Event-Based Jobs

GRANT AQ_ADMINISTRATOR_ROLE TO USERA; 
GRANT EXECUTE ON DBMS_SCHEDULER TO USERA; 
GRANT EXECUTE ON sys.DBMS_SCHEDULER TO USERA; 
GRANT EXECUTE ON sys.DBMS_ISCHED TO USERA; 
GRANT CREATE JOB TO USERA; 
GRANT CREATE EXTERNAL JOB TO USERA; 

CREATE OR REPLACE TYPE t_event_queue_payload AS OBJECT (
    event_name VARCHAR2(30) 
); 

BEGIN 
    -- Create a queue table to hold the event queue. 
    DBMS_AQADM.create_queue_table (
     queue_table   => 'event_queue_tab', 
     queue_payload_type => 't_event_queue_payload', 
     multiple_consumers => TRUE, 
     comment    => 'Comments'); 

    --Create the event queue. 
    DBMS_AQADM.create_queue (queue_name => 'event_queue', 
          queue_table => 'event_queue_tab'); 

    -- Start the event queue. 
    DBMS_AQADM.start_queue (queue_name => 'event_queue'); 
END; 
/


BEGIN 
    DBMS_SCHEDULER.create_program (
     program_name   => 'myProg', 
     program_action  => 'USERA.PACKAGE.myProc', 
     program_type   => 'STORED_PROCEDURE', 
     number_of_arguments => 3, 
     enabled    => FALSE); 

    DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (program_name  => 'myProg', 
              argument_position => 1, 
              argument_type  => 'NUMBER'); 

    DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (program_name  => 'myProg', 
              argument_position => 2, 
              argument_type  => 'NUMBER'); 

    DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (program_name  => 'myProg', 
              argument_position => 3, 
              argument_type  => 'NUMBER', 
              DEFAULT_VALUE  => NULL); 

    DBMS_SCHEDULER.enable ('myProg'); 
    DBMS_SCHEDULER.create_job (
     'myJob', 
     program_name  => 'myProg', 
     comments   => 'StartJob', 
     auto_drop   => FALSE, 
     start_date  => SYSTIMESTAMP, 
     event_condition => 'tab.user_data.event_name = ''give_me_a_prod''', 
     queue_spec  => 'event_queue', 
     enabled   => FALSE); 

    COMMIT; 
END; 
/

PROCEDURE enqueue(param1 IN PLS_INTEGER, 
        param2 IN PLS_INTEGER DEFAULT NULL, 
        param3 IN PLS_INTEGER DEFAULT NULL) 
IS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
    l_enqueue_options  DBMS_AQ.ENQUEUE_OPTIONS_T; 
    l_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T; 
    l_message_handle  RAW (16); 
    l_queue_msg   t_event_queue_payload; 
BEGIN 
    l_queue_msg := t_event_queue_payload ('give_me_a_prod'); 

    -- Define arguments 
    DBMS_SCHEDULER.set_job_argument_value ('myJob', 1, TO_CHAR (param1)); 
    DBMS_SCHEDULER.set_job_argument_value ('myJob', 2, TO_CHAR (param2)); 
    DBMS_SCHEDULER.set_job_argument_value ('myJob', 3, TO_CHAR (param3)); 

    DBMS_AQ.enqueue (queue_name   => 'USERA.event_queue', 
        enqueue_options  => l_enqueue_options, 
        message_properties => l_message_properties, 
        payload    => l_queue_msg, 
        msgid    => l_message_handle); 

    COMMIT; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.put_line (
     SQLERRM || ' - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
END enqueue; 

पैकेज में:

PROCEDURE myProc(param1 IN PLS_INTEGER, 
        param2 IN PLS_INTEGER DEFAULT NULL, 
        param3 IN PLS_INTEGER DEFAULT NULL) 
IS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
... 
    PKG_SAP_FSCD_INTERRECIBOS.callSomething.... 
... 

END myProc; 
1

DBMS_SCHEDULER.RUN_JOB (JOB_NAME => 'myJob', USE_CURRENT_SESSION => गलत);

अब, जाँच documentation:

यह निर्दिष्ट करता है या नहीं, काम रन ही वाले सत्र में हो जाना चाहिए कि प्रक्रिया से लागू किया गया था।

use_current_session सही पर सेट किया जाता है:

  • काम करने वाले उपयोगकर्ता RUN_JOB कहा जाता है के रूप में चलाता है, या एक क्रेडेंशियल के साथ एक स्थानीय बाहरी काम के मामले में, उपयोगकर्ता
    क्रेडेंशियल में नाम दिया है।

  • आप एक नौकरी का परीक्षण कर सकते हैं और कमांड लाइन पर कोई भी संभावित त्रुटियां देख सकते हैं।

  • run_count, last_start_date, last_run_duration, और fail_count अद्यतन नहीं हैं।

  • RUN_JOB नियमित रूप से निर्धारित नौकरी चलाने के साथ समानांतर में चलाया जा सकता है।

use_current_session असत्य पर सेट होने पर:

  • काम उपयोगकर्ता के लिए जो काम मालिक है के रूप में चलाता है।

  • आपको त्रुटि जानकारी खोजने के लिए जॉब लॉग की जांच करनी होगी।

  • run_count, last_start_date, last_run_duration, और fail_count अपडेट किए गए हैं।

  • RUN_JOB नियमित रूप से निर्धारित नौकरी चलने पर विफल रहता है।

+0

धन्यवाद, लेकिन गलत का उपयोग कर क्या जो मैं पहले से ही सूचना दी थी। मुझे एक नया काम शुरू करने की ज़रूरत है, भले ही एक अन्य उदाहरण चल रहा हो। मुझे यहां थोड़ा बदलाव के साथ सही मूल्य का प्रयास करने दें। – milheiros

+0

यदि मैं सत्य का उपयोग करता हूं तो मुझे एसिंक नौकरी निष्पादन नहीं हो सकता है। गलत के साथ मैं एक ही नौकरी – milheiros

+1

हाँ के एकाधिक निष्पादन नहीं कर सकता, यदि आपको वास्तव में समानांतर निष्पादन की आवश्यकता है तो आपको कतारों के बारे में पढ़ना चाहिए (उदाहरण के लिए: https://oracle-base.com/articles/10g/scheduler-enhancements-10gr2) – Stawros

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