ओरेकल में, एक स्वायत्त लेनदेन मुख्य लेनदेन में वापस किए या रोल किए बिना उसी सत्र में डेटा को कमिट या रोलबैक कर सकता है। PRAGMA (कंपाइलर निर्देश) कथन का उपयोग Oracle में स्वायत्त लेनदेन को परिभाषित करने के लिए किया जाता है। निम्नलिखित एक Oracle स्वायत्त लेनदेन उदाहरण है।
Oracle में स्वायत्त लेनदेन को परिभाषित करने के लिए सिंटैक्स
PRAGMA AUTONOMOUS_TRANSACTION; /* in the declaration section of PL/SQL Block */
स्वायत्त लेनदेन के लिए Oracle संग्रहीत कार्यविधि उदाहरण
स्वायत्त लेनदेन के लिए निम्नलिखित Oracle संग्रहीत कार्यविधि किसी भी PL/SQL प्रोग्राम (प्रक्रियाओं, पैकेजों या कार्यों, आदि) में हुई त्रुटियों को लॉग करना है। यह त्रुटि जानकारी को तालिका error_log में सम्मिलित करेगा और किसी भी पीएल/एसक्यूएल प्रोग्राम में किसी भी मुख्य लेनदेन को प्रभावित किए बिना डेटा को प्रतिबद्ध करेगा। त्रुटि जानकारी लॉग करने के लिए आप किसी भी PL/SQL प्रोग्राम से इस प्रक्रिया को कॉल कर सकते हैं। नीचे मैं आपको दिखाऊंगा कि कैसे। अपने सिस्टम में परीक्षण के लिए निम्नलिखित ऑब्जेक्ट बनाएं:
टेबल एरर_लॉग बनाएं
CREATE TABLE error_log ( error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100) ) /
लॉग त्रुटियों के लिए स्वायत्त लेनदेन के लिए Oracle संग्रहीत कार्यविधि
नीचे की प्रक्रिया में तीन पैरामीटर होते हैं, जिन्हें त्रुटि के समय अन्य संग्रहीत प्रक्रियाओं या कार्यों से प्रक्रिया को कॉल करते समय आपको पास करने की आवश्यकता होती है।
CREATE OR REPLACE PROCEDURE prc_log_errors (v_error_code IN VARCHAR2,
v_error_msg IN VARCHAR2,
v_plsql_program IN VARCHAR2)
AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO error_log (ERROR_CODE,
ERROR_MSG,
DATE_OCCURRED,
PLSQL_PROGRAM_REF)
VALUES (v_error_code,
v_error_msg,
SYSDATE,
v_plsql_program);
COMMIT;
END;
/ अब आप संग्रहीत कार्यविधि prc_log_errors . को कॉल कर सकते हैं त्रुटि जानकारी लॉग करने के लिए अन्य पीएल/एसक्यूएल प्रोग्राम के अपवाद हैंडलिंग अनुभाग से। यहां एक उदाहरण दिया गया है:
टेबल टेस्ट_डेटा बनाएं
CREATE TABLE test_data (some_data VARCHAR2 (100)) /
फ़ंक्शन बनाएं fnc_test
निम्न फ़ंक्शन कुछ डेटा को test_data . में सम्मिलित करेगा तालिका, और उसके बाद, यह त्रुटि उत्पन्न करेगा क्योंकि यह अगली पंक्ति में 0 से विभाजित हो रहा है। त्रुटि होने पर, अपवाद अनुभाग में, यह प्रक्रिया prc_log_errors . को कॉल कर रहा है त्रुटि लॉग करने के लिए। यदि फ़ंक्शन बिना किसी त्रुटि के निष्पादित होता है, तो यह TRUE लौटाएगा अन्यथा यह FALSE लौटाएगा। नीचे के मामले में, यह त्रुटि दर्ज करने के बाद FALSE लौटाएगा।
CREATE OR REPLACE FUNCTION fnc_test
RETURN BOOLEAN
IS
n NUMBER;
BEGIN
INSERT INTO test_data
VALUES ('abc');
/* generate error */
n := 2 / 0;
RETURN TRUE;
EXCEPTION
WHEN OTHERS
THEN
prc_log_errors (TO_CHAR (SQLCODE), SQLERRM, 'FNC_TEST');
RETURN FALSE;
END fnc_test;
/ परीक्षा
उपरोक्त फ़ंक्शन को कॉल करें fnc_test ।
BEGIN
IF fnc_test
THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
END;
/ यहां तक कि यह विफल होने पर भी वापस आ रहा है, लेकिन फिर भी, डेटा error_log तालिका में सहेजा जाएगा, क्योंकि प्रक्रिया prc_log_errors PRAGMA AUTONOMOUS_TRANSACTION का उपयोग कर रहा है ।
test_data तालिका जांचें, कोई रिकॉर्ड नहीं होना चाहिए।
SELECT * FROM test_data;
आउटपुट
no rows selected.
error_log तालिका में डेटा जांचें
SELECT * FROM error_log;
आउटपुट
ERROR_CODE ERROR_MSG DATE_OCCURRED PLSQL_PROGRAM_REF -1476 ORA-01476: divisor is equal to zero 27/03/2019 15:43:12 FNC_TEST
यह भी देखें:
- ओरेकल पीएल/एसक्यूएल बल्क कलेक्ट विथ सेव एक्सेप्शन उदाहरण