0

我是 Oracle Form 和 pl/sql 的新手。这是我的问题 在我的表单中,我得到了 3 个数据块,这些数据块显示了我从名为 BOS_M_HOLIDAY 的表中检索到的记录。但不知何故,循环后每个数据块中只显示最后一条记录。我检索记录的方式是使用 PRE-FORM 触发器和 WHEN-TIME-EXPIRED 触发器。这是我在 PRE-FORM 触发器中的代码:

DECLARE

CURSOR a_aa is SELECT HOL_DATE FROM BOS_M_HOLIDAY WHERE REGEXP_LIKE(HOL_DATE, '.......12') ORDER BY HOL_DATE;
CURSOR a_bb is SELECT HOL_DATE FROM BOS_M_HOLIDAY WHERE REGEXP_LIKE(HOL_DATE, '.......13') ORDER BY HOL_DATE ;
CURSOR a_cc is SELECT distinct DESCR FROM BOS_M_HOLIDAY WHERE REGEXP_LIKE(HOL_DATE, '.......13')ORDER BY 1;
Timer_ID TIMER;

BEGIN

OPEN a_aa;
LOOP
    FETCH a_aa INTO :holiday_2012.HOL_DATE;
    EXIT WHEN a_aa%notfound;
    Timer_ID := FIND_TIMER('CALL_NEXT_RECORD');
        IF NOT Id_Null(Timer_ID) THEN
        Delete_Timer(Timer_ID);
        END IF;
    Timer_ID := Create_Timer('CALL_NEXT_RECORD',1,NO_REPEAT);
END LOOP;
CLOSE a_aa;

OPEN a_bb;
LOOP
    FETCH a_bb INTO :holiday_2013.HOL_DATE;
    EXIT WHEN a_bb%notfound;
    Timer_ID := FIND_TIMER('CALL_NEXT_RECORD');
        IF NOT Id_Null(Timer_ID) THEN
        Delete_Timer(Timer_ID);
        END IF;
    Timer_ID := Create_Timer('CALL_NEXT_RECORD',1,NO_REPEAT);
END LOOP;
CLOSE a_bb;

OPEN a_cc;
LOOP
    FETCH a_cc INTO :description.DESCR;
    EXIT WHEN a_cc%notfound;
    Timer_ID := FIND_TIMER('CALL_NEXT_RECORD');
        IF NOT Id_Null(Timer_ID) THEN
        Delete_Timer(Timer_ID);
        END IF;
    Timer_ID := Create_Timer('CALL_NEXT_RECORD',1,NO_REPEAT);
END LOOP;
CLOSE a_cc;

END;

这是我在 WHEN-TIME-EXPIRED 触发器中的代码:

DECLARE
v_Timer VARCHAR2(30) := Get_Application_Property(TIMER_NAME);
BEGIN
IF (v_Timer = 'CALL_NEXT_RECORD') THEN
    NEXT_RECORD;
END IF;
END;

当我使用没有 TIMER 部分的 WHEN-BUTTON-PRESSED 触发器时,此代码有效。裸露我的英语,如果您不明白任何部分,请随时问我。谢谢!

4

1 回答 1

4

在您的循环中,每个记录都被分配给每个块中的相同(第一个)记录。当然,您创建了一个发出 a 的计时器NEXT_RECORD,但这是迄今为止最糟糕的想法 - 并且无论如何都不起作用,因为当计时器实际执行时,大多数(如果不是全部)循环已经完成。您的循环中没有任何内容可以等待计时器在进入下一条记录之前完成 - 事实上,它可能会在计时器有机会实际运行之前多次创建和销毁计时器!

不要在这类事情上使用计时器。您需要NEXT_RECORD在循环中调用。

另外,我建议您不要将此类代码放入PRE-FORM- 而是将其放入您的WHEN-NEW-FORM-INSTANCE触发器中。

更好的是,您应该将块基于表(将谓词放在DEFAULT_WHERE属性中)并执行查询,而不是使用此过程代码。

于 2013-09-13T04:41:08.763 回答