SYS.ODCINUMBERLIST
सिर्फ एक सूची है जहां प्रत्येक रिकॉर्ड में एक ही संख्या होती है। प्रत्येक पंक्ति में एकाधिक फ़ील्ड संग्रहीत करने के लिए आपको एक नए रिकॉर्ड प्रकार का उपयोग करने की आवश्यकता है।
आप SYS.ODCINUMBERLIST
. के स्थान पर उपयोग करने के लिए रिकॉर्ड प्रकार को परिभाषित कर सकते हैं . लेकिन मैं SELECT
को स्थानांतरित करने के लिए इच्छुक हूं एक स्पष्ट कर्सर होने के लिए कथन, ताकि आप एक नए प्रकार को कर्सर के रूप में परिभाषित कर सकें %ROWTYPE
. इस तरह, आपका रिकॉर्ड प्रकार और चयन कथन हमेशा संगत होते हैं, लेकिन यह आपके कोड की संरचना को थोड़ा बदल देता है।
यह रहा वह तरीका:
DECLARE
CURSOR c_select IS
SELECT project_id, project_name
FROM
(
SELECT t1.project_id, t1.project_name FROM table_one t1
MINUS
SELECT t2.project_id, t2.project_name FROM table_two t2 );
TYPE l_missing_row_list_typ IS TABLE OF c_select%ROWTYPE;
l_missing_row_list l_missing_row_list_typ;
BEGIN
OPEN c_select;
FETCH c_select BULK COLLECT INTO l_missing_row_list;
CLOSE c_select;
FORALL i IN l_missing_row_list.FIRST..l_missing_row_list.LAST
INSERT INTO table_two VALUES ( l_missing_row_list(i).project_id, l_missing_row_list(i).project_name );
COMMIT;
-- Values are now inserted and you have the list of IDs in l_missing_row_list to add to your email.
END;
BULK COLLECT
के बारे में एक नोट (यहां और आपकी मूल पोस्ट दोनों में) -- जो डेटा आप थोक में एकत्र कर रहे हैं वह पीजीए मेमोरी में संग्रहीत है। इसलिए इस कोड का उपयोग इस तरह न करें जैसे कि यदि कोई परिवर्तन होता है तो नए रिकॉर्ड की संख्या अनुचित होगी (शायद कुछ हज़ार से अधिक)।