我有MAIN_TABLE,它拥有700万条记录。我必须
我使用游标创建了一个存储过程,以便从MAIN_TABLE复制到MAIN_TABLE_ARCHIVAL。 我有复合主键(CONSTRAINT“PK_MAIN_TABLE”PRIMARY KEY(“SERVICE”,“TR_SOURCE”,“TR_ID”)
复制时我收到00001. 00000 - “违反了唯一约束(%s。%s)”错误,即使我没有插入任何重复的密钥,但同时将记录复制到MAIN_TABLE_ARCHIVE中。
我的代码看起来像(我有大约20个字段,所以我没有粘贴整个代码):
DECLARE
c_id customers.id%type;
c_name customers.name%type;
c_addr customers.address%type;
CURSOR c_customers is
SELECT id, name, address FROM customers;
BEGIN
OPEN c_customers;
LOOP
FETCH c_customers into c_id, c_name, c_addr;
EXIT WHEN c_customers%notfound;
dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr);
commit;
END LOOP;
CLOSE c_customers;
END;
/
我尝试调试,但没有运气,因为我不熟悉PL / SQL。任何人都可以告诉我为什么会这样吗?我该如何实施上述任务?
答案 0 :(得分:0)
要将数据从一个表复制到另一个表,您不需要任何光标。您甚至不需要存储过程。你可以用一个简单的sql语句来实现这个目的:
insert into MAIN_TABLE_ARCHIVAL select * from MAIN_TABLE where <...your condition...>
要提高性能,可以使用“+ append”提示。
答案 1 :(得分:0)
看看这个: Unique constraint violation during insert: why? (Oracle)
将序列中的起始值与表格中的MAX(ID)进行比较。
SELECT MAX(ID_Column) FROM Schema.Table;
SELECT Schema.Table_Sequence.nextval from DUAL;