Есть такие таблицы:
CREATE TABLE COMPACT_JOBS
(
JOB_ID NUMBER NOT NULL,
PERIOD_FROM DATE NOT NULL,
PERIOD_TO DATE NOT NULL,
CLOCK_START DATE,
CLOCK_FINISH DATE
);
CREATE TABLE COMPACT_BATCH
(
JOB_ID NUMBER NOT NULL,
BATCH_ID NUMBER NOT NULL,
PERIOD DATE NOT NULL,
CLOCK_START DATE,
CLOCK_FINISH DATE,
CLOCK_STATUS DATE,
STATUS VARCHAR2(255 BYTE)
);
Есть такой фрагмент PL/SQL кода:
Period := PeriodFrom;
while (Period < PeriodTo) loop
...
BEGIN
BatchID := null;
select BATCH_ID into BatchID
from COMPACT_BATCH
where JOB_ID = JobID
and PERIOD = Period
and CLOCK_FINISH is null
;
EXCEPTION
when NO_DATA_FOUND then BatchID := null;
END;
if (BatchID is null) then
select max(BATCH_ID) into BatchID from COMPACT_BATCH where JOB_ID = JobID;
BatchID := nvl(BatchID,0) + 1;
insert into COMPACT_BATCH (JOB_ID, BATCH_ID, PERIOD, CLOCK_START) values (JobID, BatchID, Period, sysdate);
DBMS_OUTPUT.PUT_LINE('Период '||to_char(Period, 'yyyy-mm')||' - новая обработка #'||BatchID);
else
DBMS_OUTPUT.PUT_LINE('Период '||to_char(Period, 'yyyy-mm')||' - возобновление обработки #'||BatchID);
end if;
...
<<PERIOD_NEXT>>
Period := add_months(Period, 1);
end loop;
По идее этот код должен заполнять таблицу COMPACT_BATCH месяцами, если они еще не были добавлены.
Однако при его выполнении получается такой вывод (таблица COMPACT_BATCH на момент запуска пустая):
Период 2009-01 - новая обработка #1
Период 2009-02 - возобновление обработки #1
Период 2009-03 - возобновление обработки #1
...
После выполнения кода в таблице COMPACT_BATCH одна запись с BATCH_ID=1.
Как такое может получаться, если в запросе присутствует PERIOD = Period?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.