tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von MPr
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
1136
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    xnicnacx xnicnacx ist offline Mitglied Bronze
    Registriert seit
    Jan 2007
    Beiträge
    31
    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 .....
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    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 aufrufst
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    xnicnacx xnicnacx ist offline Mitglied Bronze
    Registriert seit
    Jan 2007
    Beiträge
    31
    Damit ist mir auf jeden Fall schonmal geholfen, das ist immerhin einfacher als mein Ansatz.
    Vielen Dank
    Nico
     

  4. #4
    Avatar von ishino
    ishino ishino ist offline Mitglied Gold
    Registriert seit
    Dec 2005
    Beiträge
    207
    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”

  5. #5
    MPr MPr ist offline Mitglied Silber
    Registriert seit
    Oct 2006
    Ort
    Saarbrücken
    Beiträge
    82
    Zitat Zitat von ishino Beitrag anzeigen
    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
     

  6. #6
    xnicnacx xnicnacx ist offline Mitglied Bronze
    Registriert seit
    Jan 2007
    Beiträge
    31
    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
     

  7. #7
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    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 Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  8. #8
    xnicnacx xnicnacx ist offline Mitglied Bronze
    Registriert seit
    Jan 2007
    Beiträge
    31
    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
     

  9. #9
    MPr MPr ist offline Mitglied Silber
    Registriert seit
    Oct 2006
    Ort
    Saarbrücken
    Beiträge
    82
    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 sein
    Geändert von MPr (25.09.07 um 12:49 Uhr) Grund: Nachtrag
    xnicnacx bedankt sich. 

  10. #10
    xnicnacx xnicnacx ist offline Mitglied Bronze
    Registriert seit
    Jan 2007
    Beiträge
    31
    omg Vielen Dank
    Darauf wäre ich allein nie gekommen... Bin jedesmal aufs Neue beeindruckt von den Leuten in diesem Forum

    Nico
     

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 03.06.09, 00:12
  2. [Oracle] bestimmten "Zeilenbereich" einer Tabelle anzeigen.
    Von Thomas Darimont im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 19.02.08, 18:52
  3. "Popup" "Wollen Sie die Datensätze wirklich löschen?"
    Von uafsc im Forum Javascript & Ajax
    Antworten: 9
    Letzter Beitrag: 25.09.07, 16:51
  4. Antworten: 1
    Letzter Beitrag: 30.10.05, 18:20
  5. [EXCEL] Tabelle "verschieben"
    Von uwee im Forum Sonstige Sprachen
    Antworten: 1
    Letzter Beitrag: 30.06.05, 20:36