Переменная не принимает значение в цикле PL/SQL

Alibek B.
Дата: 01.10.2015 11:18:16
Есть такие таблицы:
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?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
Добрый Э - Эх
Дата: 01.10.2015 11:23:52
Alibek B.,

сколько можно наступать на одну и туже граблю?
как оракл доложен понять, где у тебя переменная цикла, а где - поле таблицы?
исходя из области видимости переменных ты сравниваешь поле таблицы само с собой, а не с переменной цикла, как тебе это кажется.
JDS
Дата: 01.10.2015 11:24:23
Alibek B.
Как такое может получаться, если в запросе присутствует PERIOD = Period?

PL/SQL регистронезависимый вроде как не? )
tru55
Дата: 01.10.2015 11:24:59
Баян.
Не надо называть переменную так же, как поле таблицы
Elic
Дата: 01.10.2015 11:26:32
За столько лет уже можно было бы прочитать документацию.
RTFM Column Name Precedence (FAQ)
Alibek B.
Дата: 01.10.2015 12:03:05
Блин, действительно.
Можно закрывать.