Я хочу обработать большое количество записей, и я использую инструкцию массового сбора для извлечения данных в таблицу записей.Тем не менее, я уверен, что есть более адекватный способ достичь того, что я ищу.Вот код:
FUNCTION GET_STORE_ITEMS(I_store IN STORE.STORE%TYPE,
I_item_status IN WIN_STORE.STATUS%TYPE,
----------- output ------------
O_item_data OUT NB_TAB_ITEM_DETAIL,
----------- error -------------
O_error_message OUT VARCHAR2)
RETURN BOOLEAN IS
-- ----------------------------------
-- VARIABLES --
-- ----------------------------------
L_program VARCHAR2(100) := 'NB_ITEM_INFO_SQL.GET_ITEM_DETAIL';
L_error_message VARCHAR2(500) := '';
--
-- ----------------------------------
-- CURSORS --
-- ----------------------------------
-- 003 begin
CURSOR C_get_info IS
-- #004 - begin
SELECT NB_REC_ITEM_DETAIL(sku, desc_up, system_ind, status, division, div_name, group_no, group_name,
dept, dept_name, class, class_name, subclass, sub_name, nb_var_weight,
(SELECT upc as primary_ean
FROM upc_ean u
WHERE u.sku = tab.sku
AND u.primary_upc_ind = 'Y'
AND rownum = 1),
CAST( multiset(SELECT u.upc
FROM upc_ean u
WHERE u.sku = tab.sku
AND u.primary_upc_ind <> 'Y')
AS NB_TAB_ITEM_EAN )
)
FROM (SELECT info.sku,
info.desc_up,
info.nb_var_weight,
info.system_ind,
info.status,
div.division,
div.div_name,
c.group_no,
b.group_name,
info.dept,
c.dept_name,
info.class,
a.class_name,
info.subclass,
e.sub_name
FROM (SELECT w.store,
w.sku,
nvl(wa.nb_var_weight, 'N') nb_var_weight,
w.status,
ts.desc_up,
ts.system_ind,
ts.dept,
ts.class,
ts.subclass
FROM win_store w,
win_attributes wa,
desc_look ts,
deps d
WHERE w.sku = wa.sku
AND w.store = I_store
AND wa.sku = ts.sku
-- AND (w.status = I_item_status OR I_item_status IS NULL)
AND d.dept = ts.dept
UNION ALL
SELECT st.store,
st.sku,
'N' nb_var_weight,
st.status,
ts.desc_up,
ts.system_ind,
ts.dept,
ts.class,
ts.subclass
FROM rag_skus_st st,
desc_look ts,
deps d
WHERE st.store = I_store
AND ts.sku = st.sku
-- AND (st.status = I_item_status OR I_item_status IS NULL)
AND d.dept = ts.dept
UNION ALL
SELECT ps.store,
ps.pack_no,
'N' nb_var_weight,
ps.status,
ts.desc_up,
ts.system_ind,
ts.dept,
ts.class,
ts.subclass
FROM packstore ps,
desc_look ts,
deps d
WHERE ps.store = I_store
AND ps.pack_no = ts.sku
-- AND (ps.status = I_item_status OR I_item_status IS NULL)
AND d.dept = ts.dept
)info,
deps c,
groups b,
division div,
class a,
subclass e
WHERE c.dept = info.dept
AND b.group_no = c.group_no
AND div.division = b.division
AND a.dept = info.dept
AND a.class = info.class
AND e.dept = info.dept
AND e.class = info.class
AND e.subclass = info.subclass
) tab;
--
BEGIN
--
-- Instantiate output structure object.
--
O_item_data := NB_TAB_ITEM_DETAIL();
--
OPEN C_get_info;
FETCH C_get_info BULK COLLECT INTO O_item_data;
CLOSE C_get_info;
--
RETURN TRUE;
--
EXCEPTION
--
WHEN OTHERS THEN
--
IF C_get_info%ISOPEN THEN
--
CLOSE C_get_info;
--
END IF;
--
O_error_message := SQL_LIB.CREATE_MSG('PACKAGE_ERROR',
SQLERRM,
L_program,
TO_CHAR(SQLCODE));
RETURN FALSE;
--
--
END GET_STORE_ITEMS;
В худшем случае количество возвращаемых строк составляет ~ 1,4 миллиона.Можно ли как-нибудь повысить производительность запроса для такого большого количества записей?Или я должен попробовать другой подход при извлечении данных в структуру вывода?Заранее спасибо.