Несоответствие в получении COUNT (*) из таблицы - PullRequest
1 голос
/ 04 февраля 2020

В моем блоке PL / SQL есть оператор INSERT, который берет данные из представления и вставляет их в таблицу. Следующее утверждение берет count (*) из этой таблицы, которая только что вставлена ​​с новыми данными.

Между ними не происходит никакой фиксации. Как только счет из этой таблицы будет равен нулю, будет сгенерировано исключение, и программа остановится на этом. последние несколько пробежек. В чем здесь проблема?

Ниже приведен фрагмент кода

delete from table1;

   INSERT INTO table1
     (lotnum,
      sublotnum,
      lotcls_code,
      lothold_code,
      oper_date,
      part_id,
      stage_id,
      site_id,
      mfgarea_code,
      mfgstg_code,
      load_time)
     SELECT lotnum,
            sublotnum,
            lotcls_code,
            min(lothold_code) lothold_code,
            min(oper_date) oper_date,
            part_id,
            stage_id,
            site_id,
            mfgarea_code,
            mfgstg_code,
            SYSDATE
       FROM view1
       group by lotnum,
      sublotnum,
      lotcls_code,
      lothold_code,
      oper_date,
      part_id,
      stage_id,
      site_id,
      mfgarea_code,
      mfgstg_code


  select COUNT(*) INTO v_no_recs
     from table1;

   if v_no_recs = 0 then
    raise e_zero_rec_exception;
   end if;

1 Ответ

0 голосов
/ 04 февраля 2020

Если в вашем представлении нет данных, никакие записи не будут вставлены. У вас нет предложения WHERE, и такое min() всегда будет вам что-то возвращать.

Вот что вы вводите упрощенно:

WITH no_data AS (
  SELECT 1 AS lothold_cd, 'id-1' AS aps_site_id
    FROM dual
   WHERE 1 = 2
),
records_to_insert AS (
SELECT min(lothold_cd)
  FROM no_data
 GROUP BY aps_site_id
)
SELECT count(*) FROM records_to_insert;

count(*)
--------
0

В приведенном выше, если вы закомментируйте GROUP BY, вы получите 1 строку назад. Это GROUP BY пустой таблицы / представления, которая не приведет к выбору записей, несмотря на тот факт, что вы используете агрегатную функцию в ваших SELECT

Проверьте ваши WHERE условия внутри определения представления ( если таковые имеются) это должно быть что-то, чего вы не ожидаете.

Кроме того, вместо запуска INSERT и подсчета, лучше использовать SQL% ROWCOUNT.

IF SQL%ROWCOUNT = 0 THEN
    raise e_inv_size_exception;
END IF;
...