Я пытаюсь получить столбцы из ранее возвращенных в таблицу записей.Однако, когда я запускаю код в теле пакета, я получаю следующую ошибку:
ORA-06504: PL/SQL: Return types of Result Set variables or query do not match
Однако, когда я пытаюсь сделать это в окне анонимного блока PL / SQL, я могу успешно извлечь записи, используяМассовая инструкция по сбору.
Вот моя успешная попытка, как я сказал:
DECLARE
--
O_ref SYS_REFCURSOR;
-- Variable and types declaration.
TYPE REC_TYP is record (
column_1 number(8),
column_2 varchar2(13)
);
TYPE TAB_TYP is table of REC_TYP;
L_tab_typ TAB_TYP;
--
BEGIN
--
open O_ref for
select sku,
upc
from upc_ean
where sku = 2004030;
--
LOOP
--
FETCH O_ref BULK COLLECT into L_tab_typ;
EXIT WHEN L_tab_typ.COUNT = 0;
--
FOR indx IN 1 .. L_tab_typ.COUNT
LOOP
--
dbms_output.put_line('SKU: ' || L_tab_typ(indx).column_1);
dbms_output.put_line('UPC: ' || L_tab_typ(indx).column_2);
--
END LOOP;
--
END LOOP;
--
CLOSE O_ref;
--
END;
Когда я запускаю этот код, я получаю следующий вывод:
SKU: 2004030
UPC: 5601126003439
SKU: 2004030
UPC: 5601126039056
В теле пакета есть следующее:
Почему это не работает в обычном пакете?
FUNCTION GET_STORE_ITEMS(I_store IN number
----------- output ------------
O_item_data OUT NB_TAB_ITEM_DETAIL, -- i want to return a table type after I get the info from the sys_ref
----------- error -------------
O_error_message OUT VARCHAR2)
RETURN BOOLEAN IS
--
L_tab_type NB_TAB_ITEM_DETAIL;
L_sys_ref SYS_REFCURSOR;
L_test_sku number(8);
--
CURSOR C_GET_ITEMS IS
--
SELECT a.sku
FROM win_store a
WHERE a.store = I_store;
--
BEGIN
--
-- Loop over the fashion skus.
FOR R_items IN C_GET_ITEMS LOOP
--
BEGIN
--
IF GET_ITEM_DETAIL(I_store => I_store,
I_sku => R_items.sku,
O_item_data => L_sys_ref, -- returns a sys_refcursor with the same structure as the type
O_error_message => L_error_message) = FALSE THEN
--
O_error_message := NB_MESSGE40_SQL.EMESSAGE(L_error_message);
RETURN FALSE;
--
END IF;
--
LOOP
--
FETCH L_sys_ref BULK COLLECT into L_tab_type; -- It jumps to when others exception
EXIT WHEN L_tab_type.COUNT = 0;
--
FOR indx IN 1 .. L_tab_type.COUNT
LOOP
--
L_test_sku := L_tab_type(indx).sku;
--
END LOOP;
--
END LOOP;
--
END;
--
END LOOP;
--
RETURN TRUE;
--
EXCEPTION
--
WHEN OTHERS THEN
--
-- ...
RETURN FALSE;
--
END GET_STORE_ITEMS;
Спасибо!