Массовое обновление с одной таблицы на другую - PullRequest
0 голосов
/ 14 февраля 2012

Поэтому я попытался выполнить массовое обновление, чтобы скопировать значения из столбца uemte_id в таблице pp_terminal в столбец uemte_id (нулевой в начале) в таблице mm_chip.Эти две таблицы не имеют общих столбцов. Вот что я использовал:

declare
  type ue_tab is table of  
            pp_terminal.uemte_id%type;

 ue_name ue_tab;
  cursor c1 is select uemte_id from pp_terminal;

begin
 open c1;
fetch c1 bulk collect into ue_name;
 close c1;
 -- bulk insert
forall indx in ue_name.first..ue_name.last
   update mm_chip set uemte_id = ue_name(indx);

end;
/ 

И вот сообщение об ошибке, которое я получаю:

Error report:
ORA-00001: unique constraint (DPOWNERA.IX_AK7_MM_CHIP) violated
ORA-06512: at line 13
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 ]

3 голосов
/ 14 февраля 2012

То, что вы пытаетесь сделать, это:

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

Я предполагаю, что этоне то, что вы действительно хотите сделать.Это терпит неудачу, потому что у вас есть уникальное ограничение, поэтому вы не можете иметь несколько строк во второй таблице с одним и тем же значением.

0 голосов
/ 15 февраля 2012

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

CREATE TABLE test4 AS
   (SELECT     LEVEL AS cola, CAST(NULL AS number) AS colb
    FROM       DUAL
    CONNECT BY LEVEL <= 100);

CREATE TABLE test5 AS
   (SELECT     100 + LEVEL AS colc
    FROM       DUAL
    CONNECT BY LEVEL <= 99);

DECLARE
   CURSOR cur_test4 IS
      SELECT     *
      FROM       test4
      FOR UPDATE ;
   CURSOR cur_test5 IS
      SELECT * FROM test5;
   r_test5 cur_test5%ROWTYPE;
BEGIN
   OPEN cur_test5;

   FOR r_test4 IN cur_test4 LOOP
      FETCH cur_test5 INTO r_test5;

      IF cur_test5%NOTFOUND THEN
         EXIT;
      END IF;

      UPDATE test4
      SET    colb   = r_test5.colc
      WHERE  CURRENT OF cur_test4;
   END LOOP;

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