2012-01-04 5 views
19

मैं डेटा विश्लेषण टूल का उपयोग कर रहा हूं और मेरे पास आवश्यक है कि उपयोगकर्ता से मूल्य स्वीकार किया जाए, उसे पैरामीटर के रूप में पास करें और उसे तालिका में स्टोर करें। सुंदर straighforward तो मैं निम्नलिखित बयानसमाधान "एक क्वेरी के अंदर एक डीएमएल ऑपरेशन नहीं कर सकता"?

begin 
complex('SomeValue'); 
end; 

यह ठीक काम किया उपयोग करते हुए इस

create or replace 
procedure complex(datainput in VARCHAR2) 
is 
begin 
insert into dumtab values (datainput); 
end complex; 

मैं SQL डेवलपर में इस निष्पादित लिखने के लिए बैठे थे, और मूल्य तालिका में सम्मिलित किया गया था। हालांकि, उपर्युक्त विवरण डेटा विश्लेषण उपकरण में समर्थित नहीं हैं, इसलिए मैंने इसके बजाय एक फ़ंक्शन का उपयोग करने का प्रयास किया। निम्नलिखित फ़ंक्शन का कोड है, यह संकलित करता है।

create or replace 
function supercomplex(datainput in VARCHAR2) 
return varchar2 
is 
begin 
insert into dumtab values (datainput); 
return 'done'; 
end supercomplex; 

एक बार फिर मैं SQL डेवलपर में यह क्रियान्वित करने की कोशिश की, लेकिन मैं मिल गया निम्नलिखित कोड

select supercomplex('somevalue') from dual; 

मेरा प्रश्न है क्रियान्वित करने पर एक प्रश्न अंदर कोई DML कार्रवाई नहीं कर सकते हैं - मैं एक बयान की आवश्यकता है जो एसक्यूएल डेवलपर या में उल्लिखित फ़ंक्शन चला सकता है - एक ऐसा फ़ंक्शन जो मैं देख रहा हूं जिसे चुनकर निष्पादित किया जा सकता है बयान। - यदि मैं जो पूछ रहा हूं वह करना संभव नहीं है, तो मुझे एक कारण चाहिए ताकि मैं अपने प्रबंधक को सूचित कर सकूं क्योंकि मैं पीएल/एसक्यूएल में बहुत नया हूं (एक सप्ताह पुराना?) इसलिए मुझे नियमों से अवगत नहीं है और वाक्यविन्यास।

पीएस मैं कैसे इच्छा इस सी ++ या यहाँ तक कि जावा :(

संपादित था

मैं क्योंकि (जो उपकरण है) DMine में इसे चलाने के क्रम में अगर यह होता है परीक्षण करने के लिए इससे पहले कि SQL डेवलपर पर समारोह चलाने की आवश्यकता वैध है या नहीं। कुछ भी एसक्यूएल में अमान्य DMine में भी अवैध है, लेकिन नहीं दूसरी तरह के आसपास।

मदद के लिए धन्यवाद, मैं इस स्थिति से समझा और क्यों यह अवैध/है के रूप में

+0

आपको जो त्रुटि मिल रही है वह SQL डेवलपर विशिष्ट नहीं है, यह ओरेकल त्रुटि है और यह बहुत सरल है: आप किसी क्वेरी में डेटाबेस में संशोधन नहीं कर सकते हैं। अनुमानतः यह एसीआईडी ​​अनुपालन को बनाए रखने के लिए अलगाव स्तर के कारण है; अन्यथा आप एक ही समय में पूछताछ कर रहे टेबल को संशोधित कर सकते हैं और सभी नरक ढीले टूट जाएंगे! – Xophmeister

+0

क्या आप समझा सकते हैं कि आपको SQL डेवलपर में फ़ंक्शन को कॉल करने की आवश्यकता क्यों है? यह तथ्य इतना मायने क्यों रखता हे? – APC

+0

डेटा विश्लेषण उपकरण में समर्थित नहीं है? क्या उपकरण? यदि आप इस टूल में एसक्यूएल चला सकते हैं, तो आपको एक स्क्रिप्ट चलाने में सक्षम होना चाहिए (अज्ञात ब्लॉक जिसे आप प्रारंभ में दिखाते हैं)। – tbone

उत्तर

33

आप निर्देश pragma autonomous_transaction का उपयोग कर सकते हैं। यह समारोह को एक स्वतंत्र लेनदेन में चलाएगा जो ओआरए -14551 को उठाए बिना डीएमएल करने में सक्षम होगा।

ध्यान रखें कि autonomous transaction स्वतंत्र है, इसलिए डीएमएल के परिणाम माता-पिता लेनदेन के दायरे से बाहर किए जाएंगे। ज्यादातर मामलों में यह एक स्वीकार्य कामकाज नहीं होगा।

SQL> CREATE OR REPLACE FUNCTION supercomplex(datainput IN VARCHAR2) 
    2  RETURN VARCHAR2 IS 
    3  PRAGMA AUTONOMOUS_TRANSACTION; 
    4 BEGIN 
    5  INSERT INTO dumtab VALUES (datainput); 
    6  COMMIT; 
    7  RETURN 'done'; 
    8 END supercomplex; 
    9/

Function created 

SQL> SELECT supercomplex('somevalue') FROM dual; 

SUPERCOMPLEX('SOMEVALUE') 
-------------------------------------------------------------------------------- 
done 

SQL> select * from dumtab; 

A 
-------------------------------------------------------------------------------- 
somevalue 
टॉम Kyte has a nice explanation क्यों त्रुटि पहली जगह में उठाया है के बारे में

। यह सुरक्षित नहीं है क्योंकि यह उस क्रम पर निर्भर हो सकता है जिसमें पंक्तियों को संसाधित किया जाता है। इसके अलावा, ओरेकल गारंटी नहीं देता है कि फ़ंक्शन कम से कम एक बार और प्रति पंक्ति अधिकतम एक बार निष्पादित किया जाएगा।

10

सिफारिश की बस की घोषणा नहीं वापसी मान को स्वीकार करने के लिए एक चर, उदाहरण के लिए:

declare 
    retvar varchar2(4); 
begin 
    retvar := supercomplex('somevalue'); 
end; 

चयन काम नहीं करता है क्योंकि फ़ंक्शन एक सम्मिलित कर रहा है, अगर यह सब एक मूल्य वापस कर दिया गया तो यह काम करेगा।

+1

आप लौटा मूल्य रखने के लिए चर शामिल करना भूल गए हैं। – APC

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