DELETE * FROM Table Fehler

milanj

Benutzer
Beiträge
7
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!
 
Werbung:

Tommi

Datenbank-Guru
Beiträge
285
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
Das frist er aber nicht.

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
 

ukulele

Datenbank-Guru
Beiträge
4.582
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.
 

PLSQL_SQL

SQL-Guru
Beiträge
176
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
 

milanj

Benutzer
Beiträge
7
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:
 

PLSQL_SQL

SQL-Guru
Beiträge
176
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
 

akretschmer

Datenbank-Guru
Beiträge
9.423
Das frist er aber nicht.

Das ist ganz sicher keine offizielle Fehlermeldung, oder?

Wenn ich nach dem DELETE ein * hinsetze bekomme ich den Fehler:
Syntax Error, expected:

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
 
Werbung:
Oben