Ошибка оператора слияния - ошибка не может получить стабильный набор строк в исходных таблицах - PullRequest
0 голосов
/ 27 марта 2020

Привет Я получаю сообщение об ошибке при выполнении приведенного ниже оператора слияния в oracle дБ. Не могли бы вы сообщить мне, как исправить приведенную ниже ошибку?

- Запрос

MERGE INTO d_prod_fld dp USING
  (SELECT stg_prod_fld_id,
          prod_cd_id,
          country_name
   FROM stg_prod_fld_delta pd
   LEFT OUTER JOIN d_loc dl ON (dl.prod_cd_num=lpad(pd.prod_cd_id, 3, '0'))
   WHERE pd.efft_to > trunc(sysdate+1)
     AND pd.prod_cd_id IS NOT NULL ) stg
ON (dp.cd_id=stg.stg_prod_fld_id) 
WHEN matched THEN
UPDATE
SET dl.prod_country=stg.country_name;
  • d_prod_fld - таблица целевых размеров,
  • stg_prod_fld_delta - таблица этапов,
  • d_loc - таблица поиска

в основном, когда я попытался выполнить вышеупомянутый запрос в песочнице, он работает нормально, но когда я попытался выполнить в реальной среде разработки, он показывает вышеуказанную ошибку -

Ошибка запуска в строке: 1 в команде -

Отчет об ошибке -
SQL Ошибка: ORA-30926: невозможно получить стабильный набор строк в исходных таблицах
30926. 00000 - "невозможно получить стабильный набор строк в источнике таблицы "
* Причина: не удалось получить стабильный набор строк из-за большой активности dml или недетерминированного предложения c where.
* Действие: удалите все недетерминированные предложения c where переиздайте dml.

1 Ответ

0 голосов
/ 28 марта 2020

Это означает, что параллельные DML происходят в исходной таблице stg_prod_fld_delta или таблице поиска d_lo c, которые изменяют результаты запроса SELECT.

Вам необходимо получить блокировку для stg_prod_fld_delta и d_lo c используя выберите * из таблицы, где условие = значение для обновления не нужно ждать перед выполнением оператора MERGE.

Также введите COMMIT после оператора MERGE.

Пожалуйста, проверьте ниже

   SELECT *
   FROM stg_prod_fld_delta pd
   WHERE pd.efft_to > trunc(sysdate+1)
   AND pd.prod_cd_id IS NOT NULL 
   for update no wait;

   select * from d_loc dl
   for update no wait;

   MERGE INTO d_prod_fld dp USING
   (SELECT stg_prod_fld_id,
      prod_cd_id,
      country_name
      FROM stg_prod_fld_delta pd
      LEFT OUTER JOIN d_loc dl ON (dl.prod_cd_num=lpad(pd.prod_cd_id, 3, 
      '0'))
     WHERE pd.efft_to > trunc(sysdate+1)
      AND pd.prod_cd_id IS NOT NULL ) stg ON (dp.cd_id=stg.stg_prod_fld_id) 
      WHEN matched THEN
      UPDATE
      SET dl.prod_country=stg.country_name;

     COMMIT;
...