2010-08-06 13 views
5

मैं इसे थोड़ी देर के लिए समझने की कोशिश कर रहा हूं और मुझे लगता है कि यह मदद मांगने का समय है .. मैं एक स्कीमा प्रावधान स्क्रिप्ट का निर्माण कर रहा हूं और मैं कुछ स्क्रिप्ट आउटपुट जोड़ना चाहता हूं और गलती संभालना। विचार यह है कि स्क्रिप्ट आउटपुट विंडो केवल मुझे सभी शोर के बिना महत्वपूर्ण संदेश दिखाएगी।ओरेकल स्क्रिप्ट में त्रुटि प्रबंधन

Create Temporary Error Table 
Begin Transaction 

-- begin work block 
Print "Doing some types of work" 
-- do work here 

If Error and Active Transactions > 0 Then Rollback 
If Active Transactions = 0 Then Insert Error In Temp Error Table and Start Another Transaction 
-- end work block 

-- once all all work complete 
If Active Transactions > 0 Then Commit Transactions 

मैं सामान्य रूप से सिर्फ Red Gate's SQL Packager के साथ ऐसा होता है एसक्यूएल सर्वर दुनिया जो यह पता लगा है (संकेत, संकेत लाल गेट - हम एक Oracle संस्करण :) की जरूरत है) में। ओरेकल के साथ कुछ समान पाने के लिए कहां से शुरू करना है?

+2

_ मैं स्कीमा प्रावधान स्क्रिप्ट_ का निर्माण कर रहा हूं यदि आपका मतलब है कि आप टेबल बना रहे हैं और ऐसे में बदलाव कर रहे हैं; रोलबैक मदद नहीं करेगा। ओरेकल के भीतर, एक डीडीएल कमांड वर्तमान लेनदेन करता है, यदि कोई बकाया है, तो लेनदेन के भीतर खुद को चलाता है, और सफलता पर चलता है, विफलता पर वापस रोल करता है। इस प्रकार एक डीडीएल कमांड चलाने के बाद कोई बकाया लेनदेन नहीं होगा।एक पर्स त्रुटि होने पर एकमात्र अपवाद है, तो डीबी को पता नहीं है कि इसे डीडीएल कमांड चलाने वाला था, और पहली अंतर्निहित प्रतिबद्धता नहीं करेगा, न ही डीडीएल के लिए लेनदेन शुरू करेगा। यह SQL सर्वर से बहुत अलग है। –

+0

मेरी टिप्पणी एक उत्तर नहीं प्रदान करती है, यह केवल उस गड़बड़ी को इंगित करने के लिए है जहां आप जानते हैं या नहीं जानते हैं। –

+0

@ शैनन - धन्यवाद, वास्तव में यह बेकार है कि आप एक व्यापक स्कॉप्ड लेनदेन नहीं कर सकते जिसमें डीडीएल शामिल है। कुछ गलत होने पर डेटाबेस को आधे बेक्ड राज्य में छोड़कर प्रावधान प्रक्रिया में वास्तव में त्रुटि को और अधिक कठिन बनाता है। –

उत्तर

2

ओरेकल में, आप लेन-देन सीमाओं को परिभाषित - यह करने के बाद आप के लिए प्रतिबद्ध है, और प्रत्येक बयान परमाणु है।

आप एसक्यूएल उपयोग कर रहे हैं * प्लस और आप नहीं सब पर कुछ भी करना चाहते प्रतिबद्ध करने के लिए कुछ भी गलत हो जाता है, तो आप कर सकते हैं रखूँ SQL स्क्रिप्ट में निम्नलिखित:

SET ECHO ON 
SPOOL /some/path/to/logfile.log 
WHENEVER SQLERROR EXIT SQL.CODE ROLLBACK 

-- run your code or DML statements 

COMMIT; 
EXIT; 

यह बाहर बम होगा पहली बार यह एक त्रुटि का सामना करता है, इसलिए त्रुटि फ़ाइल लॉग फ़ाइल के अंत में होगी। यह किसी भी बदलाव को भी घुमाएगा, इसलिए जब तक कोई COMMIT एस (या CREATE, ALTER, DROP, GRANT, या REVOKE की तरह बयान), तो पूरा अपग्रेड सभी या कुछ भी नहीं है।

0

मैंने देखा है कि ज्यादातर मामलों में, स्क्रिप्ट का उपयोग करके ऐसे (दोहराने) कार्यों को स्वचालित किया जाता है।

एक तरीका यह है कि हम वर्तमान में यह एक यूनिक्स स्क्रिप्ट है जो किसी दिए गए निर्देशिका में सभी .sql फ़ाइलों को चलाता है और एक .log फ़ाइल उत्पन्न करता है। प्रक्रिया के अंत में, हम लॉग फ़ाइल को grep करते हैं और देखते हैं कि कोई त्रुटि है या नहीं।

आपको मैन्युअल रूप से किसी भी त्रुटि को मुद्रित करने की आवश्यकता नहीं है, क्योंकि sqlplus पहले से ही त्रुटि को प्रिंट करता है और यह लॉग फ़ाइल में कब्जा कर लिया जाता है।

नीचे एक बहुत ही सरल उदाहरण है ...

.ksh फ़ाइल

#!/usr/bin/ksh 
echo "Starting provisioning script.." 

sqlplus scott/[email protected] > file1.log << ! 
@file1.sql 
@file1.sql 
! 

echo "end of provisioning script" 

और file1.sql की सामग्री (जो इस उदाहरण के लिए एक ही निर्देशिका में है)

create table test123(
    id number, 
    name varchar2(200) 
); 

जब मैं इस स्क्रिप्ट को चलाता हूं, पहला निर्माण सफल होता है और दूसरा विफल रहता है .. और लॉग फ़ाइल .. ..

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Aug 6 20:44:08 2010 

Copyright (c) 1982, 2007, Oracle. All Rights Reserved. 


Connected to: 
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 

SQL> 
Table created. 

SQL> create table test123(
      * 
ERROR at line 1: 
ORA-00955: name is already used by an existing object 


SQL> Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 

आप इन पंक्तियों के साथ एक स्क्रिप्ट तैयार कर सकते हैं .. और फिर लॉग फ़ाइल में किसी भी त्रुटि की तलाश करें .. निष्पादन पूर्ण होने के बाद। आप विभिन्न स्क्लप्लस सत्र कमांड का उपयोग सभी अवांछित टिप्पणियों से छुटकारा पाने के लिए कर सकते हैं।

मुझे ऐसा कोई भी स्वचालित उपकरण नहीं पता है जो ऐसा करता है। कारण मैं हमेशा है

आशा इस मदद करता है ...

+0

यदि संभव हो तो मैं शेल स्क्रिप्ट को मिश्रित करने से दूर रहने की कोशिश कर रहा हूं। बहुत अधिक निर्भरता बनाता है। –

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