Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

DELETE * FROM Table Fehler

Dieses Thema im Forum "Oracle" wurde erstellt von milanj, 12 September 2012.

  1. milanj

    milanj Benutzer

    Hallo,
    ich habe eine einfache Prozedur geschrieben die alle Einträge einer Tabelle löschen soll die älter als 1 Monat sind und der Status (Spalte) auf processed ist. Also:

    CREATE OR REPLACE PROCEDURE delete_all_entries
    IS
    BEGIN
    DELETE FROM tabelle1 WHERE last_date > (SYSDATE - interval '1' month) AND (status = 'processed');
    END;

    Das frist er aber nicht. Wenn ich nach dem DELETE ein * hinsetze bekomme ich den Fehler:
    Syntax Error, expected:
    identifier
    paren_expr_list
    (

    Muss hir unbedingt auch eine SELECT Anweisung rein. oder?.

    Danke für jede Info!
     
  2. Tommi

    Tommi Datenbank-Guru

    Hi,

    mir ist erstmal aufgefallen, dass du mit diesem Befehl die neuesten Einträge des letzten Monats löschst, nicht die, die älter sind als einen Monat (> in < ändern!).
    Einen Syntax-Fehler kann ich so auch nicht entdecken und der '*' muss auch eigentlich nicht hinter das DELETE.

    Vielleicht hilft das ja schon ein wenig gegen
    Ansonsten könnte man vielleicht aus der vollständigen Fehlermeldung (sieht irgendwie abgeschnitten aus) noch Informationen entnehmen.
    Poste das doch mal komplett, wenn du immer noch nicht weiter kommst.

    Viele Grüße
    Tommi
     
  3. ukulele

    ukulele Datenbank-Guru

    Ich kenne INTERVAL nicht aber das ist ja auch Oracle SQL. Ich würde INTERVAL aber zusätzlich Klammern und auch kein ; hinter die DELETE Anweisung packen. SQL interpretiert das ggf. als Ende der Prozedur.
     
  4. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Hy,

    nö der ";" wird nicht als ENDE der Procedur erkannt.

    Code:
     
    CREATE OR REPLACE PROCEDURE delete_all_entries
    IS
    BEGIN
    
    DELETE * FROM tabelle1 WHERE last_date < (SYSDATE - interval '1' month) AND (status = 'processed');
    
    END;
     
    
    Müsste so passen.... Aber bitte poste ggf. nochmals die Fehlermeldung.

    Lg
     
  5. milanj

    milanj Benutzer

    Halloo,

    danke euch für die Tipps!. So passt es wie ihr auch gemeint habt:

    CREATE OR REPLACE PROCEDURE delete_all_entries
    IS
    BEGIN
    DELETE FROM tabelle1 WHERE last_date < (SYSDATE - INTERVAL '1' MONTH) AND (status = 'processed');
    END;

    Habe aber jetzt ein anderes Problem. Möchte aus dieser Prozedur einen Job machen (ist ganz leicht, man fügt in "job action" faktisch das Prozedur statement rein, so wie ich verstanden habe):

    BEGIN

    DBMS_SCHEDULER.create_job (
    job_name => 'delete_all_entries',
    job_type => 'PLSQL_BLOCK',
    job_action => 'BEGIN DELETE FROM tabelle1 WHERE last_date < (SYSDATE - INTERVAL '1' MONTH) AND (status = 'processed'); END;',
    start_date => SYSTIMESTAMP,
    repeat_interval => 'FREQ=WEEKLY;BYDAY=SAT;BYHOUR=10;BYMINUTE=00',
    end_date => NULL,
    enabled => TRUE,
    comments => 'Job defined entirely by the CREATE JOB procedure.');

    END;

    Da meckert er jetzt, und bekomme folgenden Fehler im log:

    Fehlerbericht:
    Fehlerbericht:
    ORA-06550: Zeile 5, Spalte 117:
    PLS-00103: Fand das Symbol "1" als eines der folgenden erwartet wurde:

    ) , * & = - + < / > at in is mod remainder not rem
    <an exponent (**)> <> or != or ~= >= <= <> and or like like2
    like4 likec between || multiset member submultiset
    06550. 00000 - "line %s, column %s:\n%s"
    *Cause: Usually a PL/SQL compilation error.
    *Action:
     
  6. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Hy,

    liegt warscheinlich daran:

    job_action => 'BEGIN DELETE FROM tabelle1 WHERE last_date < (SYSDATE - INTERVAL '1' MONTH) AND (status = 'processed'); END;',

    Ändere dies mal auf zwei aufeinander folgende Hochkomma:

    job_action => 'BEGIN DELETE FROM tabelle1 WHERE last_date < (SYSDATE - INTERVAL ''1'' MONTH) AND (status = 'processed'); END;',

    Lg
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Das ist ganz sicher keine offizielle Fehlermeldung, oder?

    Logisch. In einer Select-Anweisung wird ein * zur vollständigen Liste der Felder erweitert. Man kann und sollte aber die Felder alle aufzählen, die man selektieren möchte. Sei es, wie es sei, aber das * ist hier eine Aufzählung der Felder.

    In einer Delete - Anweisung macht es nicht wirklich Sinn, die zu löschenden Felder aufzuzählen, denn wenn man einen Datensatz löscht, dann den ganzen. Ansonsten wäre es eher ein UPDATE. Daher ist eine Aufzählung der Felder beim Delete nicht nur hyperfluid, also überflüssig, sondern auch syntaktisch falsch.

    Logisch, oder?


    Andreas
     
  8. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Uuuups.. das mit Delete * from.. war ein Tippfehler!

    ja klar! Hier gehört natürlich kein "*"!!!!!


    Lg
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden