[Oracle] Datensätze in andere Tabelle "verschieben"

xnicnacx

Mitglied
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:
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:
SQL:
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 aufrufst
 
Zuletzt bearbeitet von einem Moderator:
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".
 
Die eleganteste Lösung ist Partitionierung.

Elegant ist das schon, aber leider auch recht kostspielig, da Partitioning eine zusätzliche Option ist, die meines Wissens nur mit der Enterprise Edition des Servers lizenziert werden kann (und da ist man dann schon im Bereich mehrerer zehntausend Euro).

Gruß

MP
 
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:
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?
 
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:

SQL:
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 sein
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück