Stored procedures Oracle软件包-使用临时表创建游标

Stored procedures Oracle软件包-使用临时表创建游标,stored-procedures,cursor,oracle12c,Stored Procedures,Cursor,Oracle12c,我正在尝试解决包中存储过程的问题,需要一些指导 在SP内的某个点,一条记录或一组记录被插入临时表中。我说可能是一组记录,因为插入发生在循环中。当循环退出时,将使用此临时表中的选择和删除的临时表内容设置光标 这是否意味着游标现在将向调用它的应用程序返回空数据集 这是代码;输入是一个或多个项目ID,我删除了不必要的代码: PROCEDURE USPGETOUTCOMEBYITEMCOI ( IPSITEMIDS VARCHAR2, OPDQUERIEDON

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

在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);        
所以我执行了上面两个代码,它没有打印任何东西。这意味着一旦提交,数据将被删除,游标将返回0条记录

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

所以,回答您的问题,是的,一旦您提交,游标将返回空数据集


希望这对您有所帮助。

谢谢。这与我在示例代码中包含的内容相同吗。全局临时表是否与常规表相同?我的临时表名为temp,但它是一个常规数据库表。我只是不知道;I don’我不想在其中保存大量的数据,一旦返回游标,这些数据就会变得无用。全局临时表和常规表是不同的。您可以使用来探索更多。如果您不想深入研究,可以在执行过程中的操作后发出一个truncate。这样,对于不知道临时表的其他人来说,它将更容易理解,因为它将使用常规表和截断
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;