Z nieco ograniczonymi informacjami, poniżej jest to, co wymyśliłem. Nadal nie mam pojęcia, co się dzieje z twoim kursorem STATIC, o którym wspomniałeś w swoim pytaniu, jest zdefiniowane w twoim f_process_data()
Funkcjonować. Ponieważ nie znam pełnego kodu tej funkcji, po prostu napisałem swój własny i zadeklarowałem CURSOR jako SYS_REFCURSOR, ponieważ to właśnie zwraca funkcja.
Daj mi znać, czy to działa lub jeśli brakuje mi ważnych informacji. Czuję, że brakuje mi kluczowych informacji, aby zapewnić Ci przydatne rozwiązanie.
Utworzona przeze mnie tabela makiety o nazwie Produkty zawiera następujące kolumny i dane. Zobacz zdjęcie.
DECLARE
/* Store Ref Cursor returned by f_process_data() Function */
v_result_cursor SYS_REFCURSOR;
/* Declare Record so we can store the data FETCHed from the Cursor */
rec_products products%ROWTYPE;
/* Declare a couple Product Variables for Proof of Concept */
v_sausage NUMBER;
v_ham NUMBER;
/* Store output */
n_id NUMBER;
v_id_product VARCHAR2(100);
/* Declare Type of TABLE NUMBER */
TYPE nt_type IS TABLE OF NUMBER;
/* Create Array/Table/Collection of type nt_type to store product ids */
nt_product_ids nt_type;
/* Returns a Ref Cursor based on the product_id used as Input to this function */
FUNCTION f_process_data(p_id_process IN NUMBER, p_id_product IN NUMBER)
RETURN SYS_REFCURSOR
AS
/* Declare Ref Cursor that will be Returned */
rc_result_cursor SYS_REFCURSOR;
BEGIN
/* Open Ref Cursor based on Product ID parameter */
OPEN rc_result_cursor FOR SELECT * FROM products WHERE item_id = p_id_product;
RETURN rc_result_cursor;
END f_process_data
;
BEGIN
/* Set Product Variables to IDs */
v_sausage := 2002;
v_ham := 2009;
/* Store product ids into a Number Table so we can Loop thru it */
nt_product_ids := nt_type (v_sausage,v_ham);
FOR r IN nt_product_ids.FIRST .. nt_product_ids.LAST
LOOP
/* Get Ref Cursor using SINGLE Product ID */
v_result_cursor := f_process_data(1, nt_product_ids(r));
LOOP
FETCH v_result_cursor INTO rec_products;
n_id := rec_products.item_id;
v_id_product := rec_products.item;
EXIT WHEN v_result_cursor%NOTFOUND;
dbms_output.put_line('Product_id: ' || n_id);
dbms_output.put_line('Product: ' || v_id_product);
END LOOP; /* Cursor Loop */
/* Close Cursor */
CLOSE v_result_cursor;
END LOOP; /* Product IDs Loop */
EXCEPTION WHEN OTHERS
THEN CLOSE v_result_cursor;
END;