Oracle 12c से 19c में अपग्रेड करने के बाद, मुझे समान या समान समस्या का सामना करना पड़ा। मुझे यकीन नहीं है कि Oracle अपग्रेड के कारण समस्या क्यों हुई, और मुझे यह भी समझ में नहीं आया कि मेरा फिक्स क्यों काम करता है!
मेरी संग्रहीत कार्यविधियों में, जहां Oracle का TABLE फ़ंक्शन कुछ संग्रहीत कार्यविधि इनपुट पर लागू होता है, मुझे त्रुटि मिलती है:"ORA-21700:ऑब्जेक्ट मौजूद नहीं है या हटाने के लिए चिह्नित है"।
हालाँकि, जहाँ Oracle के TABLE फ़ंक्शन को संग्रहीत कार्यविधि के भीतर एक स्थानीय चर पर लागू किया गया था, वहाँ कोई त्रुटि नहीं थी। तो मेरा समाधान केवल तालिका फ़ंक्शन का उपयोग करने से पहले, स्थानीय चर के लिए संग्रहीत कार्यविधि इनपुट असाइन करना था, और किसी तरह इसने इस मुद्दे को हल किया!
CREATE OR REPLACE PACKAGE my_types IS
TYPE integers IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
TYPE reals IS TABLE OF FLOAT INDEX BY BINARY_INTEGER;
END my_types;
/
CREATE OR REPLACE PROCEDURE order_list
(
i_order_numbers IN my_types.integers,
o_order_numbers OUT my_types.integers,
o_order_values OUT my_types.reals
)
IS
r_order_numbers my_types.integers;
CURSOR order_list_cur (p_order_numbers my_types.integers)
IS
SELECT order_number, order_value
FROM orders
WHERE order_number IN (SELECT * FROM TABLE(p_order_numbers))
;
order_list_rec order_list_cur%ROWTYPE;
rec_no BINARY_INTEGER;
BEGIN
r_order_numbers := i_order_numbers;
rec_no := 0;
OPEN order_list_cur(r_order_numbers);
LOOP
FETCH order_list_cur INTO order_list_rec;
EXIT WHEN order_list_cur%NOTFOUND;
rec_no := rec_no + 1;
o_order_numbers(rec_no) := order_list_rec.order_number;
o_order_values(rec_no) := order_list_rec.order_value;
END LOOP;
CLOSE order_list_cur;
END order_list;