批量更新从一个表到另一个表

时间:2012-02-14 13:18:52

标签: oracle plsql

所以我尝试了批量更新,以便在mm_chip表中将值从pp_terminal表中的uemte_id列复制到uemte_id列(启动时为null)。这两个表没有共同的列。这就是我使用的:

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 个答案:

答案 0 :(得分:3)

您要做的是:

  • 从第一个表格中选择一行
  • 使用该值更新第二个表中的每一行
  • 从第一个表格中选择另一行
  • 使用该值更新第二个表中的每一行
  • 依此类推,直到循环结束

我猜这不是你真正想做的事。它失败了,因为你有一个唯一的约束,所以你不允许在第二个表中有多个具有相同值的行。

答案 1 :(得分: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;