Я пытаюсь устранить проблему с хранимой процедурой внутри пакета, и мне нужны некоторые рекомендации.
В какой-то момент внутри SP запись или набор записей вставляются во временную таблицу. Я говорю, возможно, множество записей, потому что вставка происходит внутри цикла. Когда цикл завершается, курсор устанавливается с использованием выбора из этой временной таблицы и содержимое временной таблицы удаляется.
Не означает ли это, что курсор теперь будет возвращать пустой набор данных приложению, вызывающему его?
Это код;ввод одного или нескольких идентификаторов элементов (я обрезал ненужный код):
PROCEDURE USPGETOUTCOMEBYITEMCOI
(
IPSITEMIDS VARCHAR2,
OPDQUERIEDON OUT TIMESTAMP,
OPIERRORCODE OUT NUMBER,
CUR_OUT OUT GETDATACURSOR
)
IS
LVIERRORCODE NUMBER(38):=0;
LVSQUERY VARCHAR2(4000):='';
V_NEWITEM VARCHAR2(38);
V_NEWITEM2 VARCHAR2(4000);
V_TEMPITEMID VARCHAR2(38);
V_NEWITEMSLIST VARCHAR2(4000) := REPLACE(IPSITEMIDS, '''', '');
V_ORIGINDATE TIMESTAMP;
CURSOR cur IS
SELECT REGEXP_SUBSTR(V_NEWITEMSLIST, '[^,]+', 1, LEVEL) V_NEWITEM2 FROM DUAL CONNECT BY instr(V_NEWITEMSLIST, ',',1, LEVEL -1) > 0;
BEGIN
-- Loop thorugh each ITEM ID and determine outcome, add ITEM ID and OUTCOME to temp table
FOR rec IN cur LOOP
V_NEWITEM := rec.V_NEWITEM2;
....
INSERT INTO TEMPOUTCOME
(
ITEMID,
OUTCOME,
ORIGINDATE
)
VALUES
(
V_TEMPITEMID,
V_OUTCOME,
V_ORIGINDATE
);
COMMIT;
....
END LOOP;
LVSQUERY:='SELECT ITEMID, OUTCOME, ORIGINDATE FROM TEMPOUTCOME WHERE ITEMID IN (' || IPSITEMIDS || ')';
OPEN CUR_OUT FOR LVSQUERY;
OPDQUERIEDON:= SYSTIMESTAMP;
-- Delete from temp table all item IDs used in this session
DELETE FROM TEMPOUTCOME WHERE ITEMID IN (select REGEXP_SUBSTR(IPSITEMIDS, '\''(.*?)\''(?:\,)?', 1, LEVEL, NULL, 1) FROM dual CONNECT BY LEVEL <= REGEXP_COUNT(IPSITEMIDS, '''(?: +)?(\,)(?: +)?''', 1) + 1);