2012-02-14 2 views
0

Итак, я попробовал массовое обновление, чтобы скопировать значения из столбца uemte_id в pp_terminal таблице в столбец uemte_id (нуль при запуске) в таблице mm_chip. Эти две таблицы не имеют столбцов в common.This не то, что я использовал:Массовое обновление из одной таблицы в другую

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. 

Видите ли вы какие-либо очевидные misstakes?

+0

Да, вы нарушаете уникальное ограничение при обновлении 'mm_chip'. Я предполагаю, что у вас есть ограничение, которое включает 'uemte_id'? – Ben

+0

Да, но я не вижу, как я его нарушаю, так как все uemte_ids в pp_terminal уникальны, а uemte_ids в mm_chip - null. – Baklavaman

+0

Джим Хадсон только что дал вам хорошее объяснение. В качестве дополнительной заметки вы не фиксируете или не закрываете курсор в блоке PL/SQL; хотя это может быть просто вопрос с копией и вставкой, и стоит сделать это, если вы этого не сделаете. – Ben

ответ

3

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

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

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

+0

Я не видел твой ответ Джим. Вы правы, что я хочу сделать: - выберите строку из первой таблицы - обновите строку во второй таблице с этим значением - выберите другую строку из первой таблицы - обновите другую строку во второй таблицу с этим значением - и так далее, пока петля не закончит Или, если это возможно: выберите все строки в первой таблице и обновите все строки во второй таблице с этими значениями. – Baklavaman

0

Ниже приведен один из способов обновления каждой строки одной таблицы на основе значения произвольной строки во второй таблице без повторного использования любых строк из второй таблицы. Это было бы лучше, если бы вы могли сделать это полностью в 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; 
+0

Прекрасно работает для моих целей, спасибо! (Итак, у меня отсутствовал курсор для таблицы, которую я обновлял.) – Baklavaman

Смежные вопросы