2013-06-20 4 views
8

मैं जावा एप्लिकेशन पर काम कर रहा हूं जो ओरेकल पीएल/एसक्यूएल लिखित विरासत प्रणाली के साथ एकीकृत करता है। दुर्भाग्य से मैं इस विरासत प्रणाली को बदलने में सक्षम नहीं हूँ। इस प्रणाली के साथ समस्या यह है कि कभी-कभी COMMIT स्टेटमेंट प्रक्रियाओं में लिखे जाते हैं। लेकिन इसका कारण यह है कि मैं अपने आवेदन स्तर पर लेनदेन को सही तरीके से संभालने में सक्षम नहीं हूं।प्रतिबद्ध वक्तव्यों को अनदेखा करने के लिए ऑरैकल डेटाबेस प्रक्रियाएं बनाना संभव है?

तो क्या प्रतिबद्धता वक्तव्यों को अनदेखा करने के लिए ऑरैकल डेटाबेस प्रक्रियाओं को बनाना संभव है?

मुझे पता चला है कि कनेक्शन की शुरुआत में ALTER SESSION DISABLE COMMIT IN PROCEDURE करते समय पीएल/एसक्यूएल प्रक्रिया करने की कोशिश कर रहा है जब अपवाद का कारण बन जाएगा। लेकिन ओआरकल को पीएल/एसक्यूएल कोड बदलने के बिना प्रतिबद्धता को अनदेखा करना संभव है?

+0

उहम, आप ऐसा क्यों करना चाहते हैं? – fge

+3

@fge, यदि प्रक्रिया चलती है, तो कॉलिंग लेन-देन रोलबैक नहीं कर सकता है यदि कोई कार्रवाई किसी त्रुटि का कारण बनती है। –

+5

_ "मैं इस विरासत प्रणाली को बदलने में सक्षम नहीं हूं" _ लेकिन आवेदन में 'COMMIT' कथन अक्षम करने में कोई बदलाव नहीं है? –

उत्तर

6

मुझे नहीं लगता कि आप ऐसा कर सकते हैं। आपको डिफ़ॉल्ट प्रक्रिया के साथ "प्रतिबद्ध करें" जैसी प्रक्रियाओं में पैरामीटर जोड़ना होगा। और आप उन्हें पैरामीटर सेट के साथ झूठी पर बुलाते हैं। यदि वे नेस्टेड हैं, तो पैरामीटर मान पास करें। इस तरह विरासत कोड अभी भी वही व्यवहार करता है लेकिन आपको लेनदेन नियंत्रण मिलता है।

0

मैं ने पाया है कि जब कनेक्शन की शुरुआत में ALTER SESSION DISABLE COMMIT IN PROCEDURE कर अपवाद का कारण होगा जब PL/SQL प्रक्रिया प्रतिबद्ध करने के लिए कोशिश कर रहा है।

हाँ, उस कथन का दस्तावेजी व्यवहार ओआरए-00034 अपवादों को मजबूर करना है यदि कोई प्रक्रिया प्रतिबद्ध करने का प्रयास करती है। मुझे लगता है कि एम्बेडेड कमेटी के साथ प्रक्रियाओं की पहचान करने के लिए यह वास्तव में एक परीक्षण चीज के रूप में है।

मुझे लगता है कि इसे संग्रहीत प्रक्रियाओं के लिए बुरी आदत के रूप में व्यापक रूप से माना जाता है। लेनदेन का नियंत्रण कॉलिंग स्टैक के शीर्ष से संबंधित होना चाहिए।

दुर्भाग्य से उन एम्बेडेड कामों को अनदेखा करने का कोई तरीका नहीं है। आपको या तो पीएल/एसक्यूएल रूटीन को फिर से लिखना होगा, या फिर अपने कॉलिंग कोड में कुछ वर्कअराउंड कोड करें (उदा। अपवाद हैंडलर जो प्रतिबद्ध परिवर्तनों को उलट करने के लिए अतिरिक्त डीएमएल जारी करता है)।

5

मैं 9 साल से ओरेकल के साथ काम कर रहा हूं। मैंने आपके प्रश्न के बारे में अनियंत्रित पैरामीटर भी चेक किए हैं और मुझे पूरा यकीन है कि ओरेकल को संग्रहीत प्रक्रिया की प्रतिबद्धता को अनदेखा करने का कोई तरीका नहीं है।

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

2

शायद सबसे अच्छी बात यह है कि वर्तमान कार्यक्षमता को प्रभावित किए बिना pl/sql प्रक्रियाओं को बदलने के लिए सबसे अच्छी बात है। दूसरे शब्दों में, उपयोगकर्ता को कमियों को अनदेखा करने की अनुमति देने के लिए एक नया पैरामीटर जोड़ें, लेकिन मौजूदा कार्यक्षमता के लिए डिफ़ॉल्ट (प्रतिबद्ध करने के लिए)। मैंने इसे एक समान स्थिति में किया है और यह अच्छी तरह से काम किया है।

create or replace procedure some_proc(
    i_num in number, -- existing parameter 
    i_commit in number default 1) -- perform commit? 0=false, else true 
as 

begin 
    -- some DML here 

    if (i_commit <> 0) then 
    commit; 
    end if; 

end; 

यकीन है कि यह नया पैरामीटर परम सूची के अंत में जोड़ा जाता है बनाओ:

तो, आप की तरह कुछ होगा। तो आपका ऐप i_commit के लिए 0 (झूठा) में गुज़र जाएगा।

उम्मीद है कि मदद करता है।

0

यह जानकर कि प्रक्रिया क्या उपयोगी रही होगी। हालांकि, यह सोचते हैं कि प्रक्रिया तालिकाओं की एक सीमित संख्या (यही कारण है कि हम ज्यादातर वैसे भी PLSQL में क्या है) में डेटा को संशोधित करता है, तो आप उस स्कीमा पर एक फ्लैशबैक क्वेरी चलाने की कोशिश कर सकते:

फ़्लैश बैक तालिका TABLE_NAME टाइमस्टैम्प के (TO_DATE (' 06-एसईपी -2012 23:59:59 ',' डीडी-मॉन-वाईवाई एचएच 24: एमआई: एसएस '));

आप अपने जावा कोड में प्रक्रिया कहने से ठीक पहले समय "06-SEP-2012 23:59:59" समय स्ट्रिंग सेट कर सकते हैं।

इसका एक बुरा वैकल्पिक हल के लिए, लेकिन एक कोशिश के लायक मुझे लगता है कि

+0

यह मौजूदा उत्तरों की तुलना में अधिक जानकारी नहीं है। आप उन समाधानों का निर्माण करके उन पर विस्तार कर सकते हैं जो केवल एक विशिष्ट लेनदेन को वापस लाते हैं। शायद 'VERSIONS_XID' का उपयोग करके, या 'dbms_application_info.set_client_info' और ऑडिट ट्रिगर्स को मैन्युअल रूप से परिवर्तनों के सेट को पूर्ववत करने के लिए, या लॉगमिनेर के साथ। यह सीधे प्रतिबद्धता को अनदेखा करने के सवाल को हल नहीं कर सकता है, लेकिन यह एक महान काम होगा और बक्षीस के योग्य होगा। –

0

मैं जावा अनुप्रयोग है कि पुराने सिस्टम लिखा ओरेकल PL/SQL के साथ एकीकृत करने पर काम कर रहा हूँ। दुर्भाग्यवश मैं इस विरासत प्रणाली को बदलने में सक्षम नहीं हूं।

हमम, यह राजनीति की तरह गंध करता है ... "इसे छूएं, यह काम करता है!" मेरा अनुमान। :(

तथ्य की बात के रूप में, यह पहले से ही कहा। और अगर यह था, यह अपने codebase में काफी एक बदसूरत मस्सा होगा सबसे अधिक संभावना असंभव @Tilman Fliegel (और अन्य) के रूप में एक COMMIT बयान, अनदेखा कर सकते हैं।

मुझे लगता है कि राजनीति में अच्छा नहीं कर रहा हूँ, लेकिन मैं कहना चाहता हूँ अगर आप उपयोग नहीं कर सकते और न ही इस बदलने के लिए, तो सिर्फ इस का उपयोग नहीं करते मेरा मतलब है:।

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

लेकिन शायद COMMIT एस को अनदेखा करने का प्रयास करना आसान है। मनुष्य रिफैक्टर करने के लिए बहुत कठिन हैं ...;)

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