Ich habe MAIN_TABLE, die 7 Millionen Datensätze enthält. Ich muss
- Daten der letzten 3 Monate in MAIN_TABLE aufbewahren
- Archivieren Sie die Daten der letzten 4 bis 12 Monate in MAIN_TABLE_ARCHIVAL
- 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 № 1Um 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;