/ / 00001. 00000 - "eindeutige Bedingung (% s.% S) verletzt" - Orakel, plsql

00001. 00000 - "eindeutige Einschränkung (% s.% S) verletzt" - oracle, plsql

Ich habe MAIN_TABLE, die 7 Millionen Datensätze enthält. Ich muss

  1. Daten der letzten 3 Monate in MAIN_TABLE aufbewahren
  2. Archivieren Sie die Daten der letzten 4 bis 12 Monate in MAIN_TABLE_ARCHIVAL
  3. Bereinigen Sie alle Daten, die älter als 12 Monate sind

Ich habe eine gespeicherte Prozedur mit einem Cursor zum Kopieren von MAIN_TABLE nach MAIN_TABLE_ARCHIVAL erstellt. Ich habe einen zusammengesetzten Primärschlüssel (CONSTRAINT "PK_MAIN_TABLE" PRIMARY KEY ("SERVICE", "TR_SOURCE", "TR_ID")

Während des Kopierens erhalte ich den Fehler 00001. 00000 - "Unique Constraint (% s.% S) verletzt", obwohl ich keinen doppelten Schlüssel einfüge, sondern gleichzeitig Datensätze in MAIN_TABLE_ARCHIVE kopiere.

Mein Code würde so aussehen (ich habe ungefähr 20 Felder, also füge ich nicht den gesamten Code ein):

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;
/

Ich habe versucht zu debuggen, aber kein Glück, da ich neu in PL / SQL bin. Kann mir bitte jemand sagen, warum es passiert? Wie soll ich die obige Aufgabe ausführen?

Antworten:

0 für die Antwort № 1

Um Daten von einer Tabelle in eine andere zu kopieren, benötigen Sie keinen Cursor. Sie benötigen sogar keine gespeicherten Prozeduren. Sie könnten dies mit einer einfachen SQL-Anweisung machen:

insert into MAIN_TABLE_ARCHIVAL select * from MAIN_TABLE where <...your condition...>

Um die Leistung zu verbessern, können Sie den Hinweis "+ Anhängen" verwenden.


0 für die Antwort № 2

Schau dir das an: Eindeutige Einschränkungsverletzung beim Einfügen: Warum? (Orakel)

Vergleichen Sie den Startwert aus Ihrer Sequenz mit MAX (ID) aus Ihrer Tabelle.

SELECT MAX(ID_Column) FROM Schema.Table; SELECT Schema.Table_Sequence.nextval from DUAL;