मैं वर्षों के लिए पहले कोड नमूने का उपयोग कर रहा हूं। नोट करने के बजाय नोटिस न करें।
UPDATE tablename SET val1 = in_val1, val2 = in_val2
WHERE val3 = in_val3;
IF ( sql%notfound ) THEN
INSERT INTO tablename
VALUES (in_val1, in_val2, in_val3);
END IF;
नीचे दिया गया कोड संभवतः नया और बेहतर कोड है
MERGE INTO tablename USING dual ON ( val3 = in_val3 )
WHEN MATCHED THEN UPDATE SET val1 = in_val1, val2 = in_val2
WHEN NOT MATCHED THEN INSERT
VALUES (in_val1, in_val2, in_val3)
पहले उदाहरण में अपडेट एक इंडेक्स लुकअप करता है। यह सही पंक्ति को अद्यतन करने के लिए है। ओरेकल एक निहित कर्सर खोलता है, और हम इसका उपयोग इसी प्रविष्टि को लपेटने के लिए करते हैं ताकि हम जान सकें कि प्रविष्टि केवल तब होगी जब कुंजी मौजूद नहीं होगी। लेकिन इंसर्ट एक स्वतंत्र कमांड है और इसे दूसरा लुकअप करना होता है। मुझे मर्ज कमांड के आंतरिक कामकाज का पता नहीं है लेकिन चूंकि कमांड एक एकल इकाई है, इसलिए ओरेकल एकल इंडेक्स लुकअप के साथ सही इंसर्ट या अपडेट निष्पादित कर सकता है।
मुझे लगता है कि जब आप कुछ प्रसंस्करण करते हैं तो इसका मतलब बेहतर होता है कि कुछ तालिकाओं से डेटा लेना और एक तालिका को अपडेट करना, संभवतः पंक्तियों को सम्मिलित करना या हटाना। लेकिन एकल पंक्ति मामले के लिए, आप पहले मामले पर विचार कर सकते हैं क्योंकि वाक्य रचना अधिक सामान्य है।