Oracle包-使用临时表创建一个游标



我正在尝试解决包中存储过程的问题,需要一些指导。

在SP内部的某个时刻,一条记录或一组记录被插入到临时表中。我说可能是一组记录,因为插入发生在循环中。当循环退出时,将使用此临时表中的选择设置光标,并删除临时表的内容。

这难道不意味着游标现在将向调用它的应用程序返回空数据集吗?

这是代码;输入是一个或多个项目ID(我修剪了不必要的代码(:

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);        
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条记录。

如果您通过删除/注释commit来执行上述相同的代码(plsql代码(,这将打印数据,这意味着光标正在返回记录。

所以,回答您的问题:是的,只要您提交,游标就会返回空的数据集。

最新更新