Вложенная замена для обновления - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть пакет с курсором, и я хочу заменить некоторые символы в столбце?Выбор работает, но мне нужно обновить, спасибо.Вот мой код:

DECLARE
    CURSOR get_data
    IS
        SELECT e.column1,
               e.column2,
               d.column3,
               d.column4
          FROM table1 e, table2 d
         WHERE e.column1 = d.column3;
BEGIN
    FOR i IN get_data
    LOOP
        UPDATE table1
           SET column1 = REPLACE (REPLACE (column1, 'OPRS', 'V'), 'ABV', 'T')
         WHERE column1 = i.column1
           AND column1 LIKE '2027044%';

        UPDATE table2
           SET column3 = REPLACE (REPLACE (column3, 'OPRS', 'V'), 'ABV', 'T');
    END LOOP;
END;

Ошибка:

ORA-00001: unique constraint (DB_KSS_ONLINE.NETOPERIDX) violated ORA-06512: at line 10
00001. 00000 - "unique constraint (%s.%s) violated"
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
For Trusted Oracle configured in DBMS MAC mode, you may see this message if a duplicate entry exists at a different level.
*Action: Either remove the unique restriction or do not insert the key.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Из вашего запроса курсора мы видим, что table1.column1 и table2.column3 являются идентификаторами.Это также столбцы, которыми вы манипулируете в инструкциях UPDATE.Таким образом, в процедурной логике есть пробел, который означает, что предложение SET генерирует повторяющиеся значения в уникальном столбце.Кажется, что ваши данные имеют состояние, отличное от того, что вы думаете.

Чтобы исправить это, вам нужно провести некоторое исследование данных.

  1. Является ли DB_KSS_ONLINE настоящим именемtable1 или table2 в вашем отредактированном коде?Это говорит вам, какие данные вам нужно исследовать.
  2. Запустите инструкцию SELECT, которая воспроизводит обновленные значения.Это говорит вам о том, какое дополнительное правило (фильтр) вам нужно установить.

Примерно так:

SELECT e.column1
       , case when e.column1 like '2027044%' then
              REPLACE(REPLACE(column1, 'OPRS', 'V'), 'ABV', 'T')   
              else null 
         end as updated_col1
       , d.column3
       , REPLACE(REPLACE(column3, 'OPRS', 'V'), 'ABV', 'T') as updated_col3
       , e.column2
       , d.column4
  FROM table1 e, table2 d
  WHERE  e.column1 = d.column3
  order by 4 nulls last, 2 nulls last ; 
0 голосов
/ 12 сентября 2018

Код будет:

update table1  
   set column1 = REPLACE(REPLACE(column1, 'OPRS', 'V'), 'ABV', 'T')  ;

Я думаю, вы просто пропускаете =.

Я бы порекомендовал добавить:

where column1 like '%OPRS%' or column1 like '%ABV%'

Это ограничениеобновлять логику только для соответствующих строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...