-
Hallo liebes Forum, bräuchte mal wieder eure Expertenmeinung.
Folgendes Problem:
Eine Datenbank mit 2 identischen Tabellen, eine davon hält die aktuellen Einträge, die andere ist eine Art History um die primäre Tabelle schlanker zu halten. In regelmässigen Intervallen sollen Datensätze älter als x Tage in die History-Tabelle verschoben werden.
Gibt es eine elegantere Lösung als das offensichtliche
Code :1 2 3 4 5
SELECT * FROM TAB1 WHERE datum < sysdate - interval 'x' day; INSERT INTO TAB2 ..... DELETE FROM TAB1 .....
-
Hi
Ich weiß nicht, was bei deinen Punkten noch gekommen wäre aber das ganze müsste in etwa so aussehen:
Code sql:1 2
INSERT INTO tab2 SELECT * FROM tab1 WHERE datum < sysdate - INTERVAL 'x' DAY; DELETE FROM tab1 WHERE datum < sysdate - INTERVAL 'x' DAY;
Das ganze kannste natürlich auch in eine Stored Procedure packen, die du einfach nur aufrufstGrüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
Damit ist mir auf jeden Fall schonmal geholfen, das ist immerhin einfacher als mein Ansatz.
Vielen Dank
Nico
-
Die eleganteste Lösung ist Partitionierung. Das Kopieren der Zeilen geht analog wie oben, nur fällt das (u.U. sehr "teure") DELETE weg, indem man einfach die Partition der Tabelle "wegschmeißt".
“Some may never live, but the crazy never die”
-
-
Vielen Dank für eure Anregungen. Ich habe mich für eine Stored Procedure entschieden. Beim Basteln derselbigen bekomme ich allerdings die wenig aussagekräftige Fehlermeldung:
PL/SQL: ORA-00933: SQL-Befehl wurde nicht korrekt beendet
PL/SQL: SQL Statement ignored
sowohl für den INSERT- als auch für den DELETE-Befehl.
Vermute es liegt an der Art wie ich den Parameter einsetze... Hat jemand ne Idee?
Code :1 2 3 4 5 6 7
CREATE OR REPLACE PROCEDURE migrateToHistory(daystokeep IN integer) IS BEGIN INSERT INTO tab2 SELECT * FROM tab1 WHERE col1 < sysdate - interval daystokeep day; DELETE FROM tab1 WHERE col1 < sysdate - interval daystokeep day; commit; END;
Danke für eure Mühe
-
Hi
Hast du dich bei deinem Post nur vertippt oder hast du beim Versuch die Prozedur anzulegen auch IS statts AS?
Wenn es das nicht war? Wo kommt genau die Fehlermeldung?Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
Ich benutze natürlich AS und nicht IS, das ist beim hin- und herkopieren reingerutscht.
Die Fehlermeldungen sind in Zeile 4 und 5 jeweils zum Anfang des Wortes daystokeep. Fehlen mir vielleicht irgendwelche Quotes o.Ä? Damit ärgert mich Oracle am liebsten
-
das Intervall müsste in Quotes erscheinen und der IN-Parameter innerhalb der Prozedur als Parameter identifizierbar sein. Folgendes sollte funktionieren:
Code sql:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
SQL> CREATE TABLE tab1(col1 DATE, rest NUMBER); Tabelle wurde erstellt. SQL> CREATE TABLE tab2(col1 DATE, rest NUMBER); Tabelle wurde erstellt. SQL> INSERT INTO tab1 VALUES('01.09.2007', 1); 1 Zeile wurde erstellt. SQL> INSERT INTO tab1 VALUES('11.09.2007', 2); 1 Zeile wurde erstellt. SQL> INSERT INTO tab1 VALUES('21.09.2007', 3); 1 Zeile wurde erstellt. SQL> commit; Transaktion mit COMMIT abgeschlossen. SQL> CREATE OR REPLACE PROCEDURE migrateToHistory(daystokeep IN INTEGER) 2 IS 3 BEGIN 4 EXECUTE immediate 'INSERT INTO tab2 SELECT * FROM tab1 WHERE col1 < sysdate - interval ''' || daystokeep || ''' day'; 5 EXECUTE immediate 'DELETE FROM tab1 WHERE col1 < sysdate - interval ''' || daystokeep || ''' day'; 6 commit; 7 END; 8 / Prozedur wurde erstellt. SQL> EXEC migrateToHistory(5) PL/SQL-Prozedur erfolgreich abgeschlossen. SQL> SELECT * FROM tab1; COL1 REST ---------- ---------- 21.09.2007 3 1 Zeile wurde ausgewählt. SQL> SELECT * FROM tab2; COL1 REST ---------- ---------- 01.09.2007 1 11.09.2007 2 2 Zeilen ausgewählt.
Gruß
MP
P.S.: ob man AS oder IS verwendet, sollte irrelevant seinGeändert von MPr (25.09.07 um 12:49 Uhr) Grund: Nachtrag
-
omg Vielen Dank
Darauf wäre ich allein nie gekommen... Bin jedesmal aufs Neue beeindruckt von den Leuten in diesem Forum
Nico
Ähnliche Themen
-
Datensätze mit "Prepared Statements" ausgeben - XAMPP(Apache) stürzt ab.
Von noOx im Forum PHPAntworten: 4Letzter Beitrag: 03.06.09, 00:12 -
[Oracle] bestimmten "Zeilenbereich" einer Tabelle anzeigen.
Von Thomas Darimont im Forum Relationale DatenbanksystemeAntworten: 3Letzter Beitrag: 19.02.08, 18:52 -
"Popup" "Wollen Sie die Datensätze wirklich löschen?"
Von uafsc im Forum Javascript & AjaxAntworten: 9Letzter Beitrag: 25.09.07, 16:51 -
Viele Bretter ---> "Noise" ---> jedes Brett andere "Seed"
Von Gonzo28 im Forum 3D Studio MaxAntworten: 1Letzter Beitrag: 30.10.05, 18:20 -
[EXCEL] Tabelle "verschieben"
Von uwee im Forum Sonstige SprachenAntworten: 1Letzter Beitrag: 30.06.05, 20:36



1Danke


Zitieren


Login





