डीबीएमएस_जेओबी में डीडीएल स्टेटमेंट्स

मैं डीबीएमएस_जेओबी का उपयोग करके नौकरी निर्धारित करने की कोशिश कर रहा हूं (मैं सुरक्षा कारणों से डीबीएमएस_SCHEDULER का उपयोग नहीं कर सकता), जो डीडीएल स्टेटमेंट का उपयोग करता है।

DECLARE
job_num NUMBER;
BEGIN
DBMS_JOB.SUBMIT(job => job_num,
what => 'BEGIN EXECUTE IMMEDIATE ''CREATE TABLE temp1 (ID NUMBER)''; END;'
);
DBMS_OUTPUT.PUT_LINE('JobID'||job_num);
DBMS_JOB.RUN(job_num);
END;
/

यह मुझे एक त्रुटि संदेश देने में विफल रहता है:

ओआरए -12011: 1 नौकरियों का निष्पादन विफल रहा   ओआरए -06512: "SYS.DBMS_IJOB" पर, लाइन 548   ओआरए-06512: "SYS.DBMS_JOB", लाइन 278 पर   ओआरए -06512: लाइन 8 पर

अज्ञात ब्लॉक के अंदर से DBMS_JOB.RUN() कथन को हटाने पर, मैं कम से कम नौकरी (और सहेजने) को सक्षम करने में सक्षम हूं। जब मैं नौकरी की जांच करता हूं, तो उसने इसे निष्पादित करने के लिए कोड के रूप में सहेजा है     BEGIN तत्काल तत्काल 'तालिका टेम्पलेट बनाएं (आईडी NUMBER)'; समाप्त;

अगर मैं इसे स्टैंडअलोन निष्पादित करता हूं, तो यह स्पष्ट रूप से निष्पादित होता है। जब मैं पूरी चीज़ को डीबीएमएस_जेओबी.आरयूएन() पर कॉल के माध्यम से निष्पादित करने का प्रयास करता हूं तो यह एकमात्र समय विफल हो जाता है।

क्या डीबीएमएस_जेओबी में पैरामीटर के रूप में डीडीएल स्टेटमेंट्स का उपयोग करने पर कोई प्रतिबंध है? मुझे इसके लिए दस्तावेज़ीकरण में कोई सूचक नहीं मिल रहा है।

0
जोड़ा संपादित
विचारों: 2
त्रुटि संदेश जोड़ा गया मुझे "हमेशा" मिलता है
जोड़ा लेखक Incognito, स्रोत
वास्तविक तालिका नाम, जिसे मुझे बनाना है उसे "टेम्प" नहीं कहा जाता है। मैंने अभी इस प्रश्न को पोस्ट करने के लिए इसका इस्तेमाल किया है। साथ ही, मेरा वास्तविक इरादा केवल एक अस्थायी तालिका बनाना है, न कि एक टेबल। मेरे पास बहुत लचीलापन नहीं है, क्योंकि मैं किसी एप्लिकेशन के कुछ अनुभाग को संशोधित कर रहा हूं और "अनिच्छा से" इस दृष्टिकोण से गुजरना है।
जोड़ा लेखक Incognito, स्रोत
मैंने त्रुटि संदेश "हमेशा" के बारे में कभी नहीं सुना है ...
जोड़ा लेखक Jeffrey Kemp, स्रोत
पुन: पेश करने में असमर्थ। यह मेरे लिए काम करता है (11 जीआर 2 में परीक्षण किया गया), और नौकरी ने तालिका के रूप में "टीईएमपी" तालिका बनाई।
जोड़ा लेखक Jeffrey Kemp, स्रोत
एल्ड्रिज की टिप्पणी में +1 - ऑन-द-फ्लाई बनाने वाली टेबल आमतौर पर खराब सिस्टम डिज़ाइन का संकेत होता है।
जोड़ा लेखक Jeffrey Kemp, स्रोत
क्या आप सुरक्षा कारणों पर विस्तार कर सकते हैं जो आपको DBMS_Scheduler का उपयोग करने से रोकते हैं? इसके अलावा, क्या आपने वैश्विक अस्थायी तालिकाओं का उपयोग करना देखा है? टीईएमपी नामक एक टेबल को देखकर लाल झंडा का थोड़ा सा हिस्सा है।
जोड़ा लेखक David Aldridge, स्रोत

1 उत्तर

अन्य टिप्पणीकारों की भावनाओं को प्रतिबिंबित करते समय - फ्लाई पर टेबल बनाना एक लाल झंडा है जो अक्सर इंगित करता है कि आपको वास्तव में वैश्विक अस्थायी तालिकाओं का उपयोग करना चाहिए - कुछ प्रश्न।

  1. क्या कोई कारण है कि आपको DBMS_JOB.RUN कॉल चाहिए? DBMS_JOB.SUBMIT पर आपका कॉल ओरेकल को नौकरी को अतुल्यकालिक रूप से चलाने के लिए कह रहा है जैसे ही मूल लेनदेन करता है। इसलिए, सामान्यतः, आप DBMS_JOB.SUBMIT और फिर बस 'COMMIT' कॉल करेंगे।
  2. क्या उपयोगकर्ता जो नौकरी सबमिट कर रहा है वह तालिका बनाएं विशेषाधिकार सीधे दिया गया है? मेरा अनुमान है कि उपयोगकर्ता के पास केवल एक भूमिका के माध्यम से तालिका बनाएं विशेषाधिकार प्रदान किया गया है। इससे आप अज्ञात पीएल/एसक्यूएल ब्लॉक को अंतःक्रियात्मक रूप से चलाने की अनुमति देंगे लेकिन नौकरी में नहीं। यदि ऐसा है, तो आपको एक भूमिका के माध्यम से सीधे तालिका बनाएं विशेषाधिकार प्रदान करने के लिए डीबीए की आवश्यकता होगी।
  3. जब कोई नौकरी विफल हो जाती है, तो त्रुटि संदेश के साथ अलर्ट लॉग में एक प्रविष्टि लिखी जाती है। क्या आप (या, अधिक संभावना है, डीबीए) त्रुटि संदेश प्राप्त करते हैं और चेतावनी लॉग से त्रुटि स्टैक प्राप्त करते हैं और इसे यहां पोस्ट करते हैं (मानते हैं कि यह # 2 से विशेषाधिकार समस्या के अलावा कुछ और है)।
2
जोड़ा
धन्यवाद जस्टिन। यह बहुत मदद करता है। पहले टेबल बनाने के लिए मैं उन विशेषाधिकारों के लिए डीबीए से जांच करूंगा!
जोड़ा लेखक Incognito, स्रोत