Пакет Oracle - создайте курсор, используя временную таблицу - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь устранить проблему с хранимой процедурой внутри пакета, и мне нужны некоторые рекомендации.

В какой-то момент внутри 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);        

1 Ответ

0 голосов
/ 30 октября 2019
CREATE GLOBAL TEMPORARY TABLE today_sales(order_id NUMBER)
ON COMMIT delete ROWS
set serveroutput on
declare
    cursor cur_temp is select
                           *
                       from
                           today_sales;

begin
    insert into today_sales values ( 1 );

    commit;
    for i in cur_temp loop
        dbms_output.put_line('There is data');
    end loop;
end;

Итак, я выполнил два кода выше, и он ничего не печатает. Это означает, что как только вы commit, данные будут удалены, а cursor вернет 0 записей.

И если вы выполните тот же код выше (код plsql) с помощью удаление / комментирование commit, это будет печатать данные, что означает, что курсор возвращает записи.

Итак, ответьте на ваш вопрос, Да, курсор вернет пустой набор данных, как только вы подтвердите.

Надеюсьэто поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...