Kommentare in Oracle SQL können auf verschiedene Arten angegeben werden. Es gibt mindestens 3 verschiedene Möglichkeiten Kommentare innerhalb von sqlplus zu kennzeichnen:
1) Stichwort REMARK
Mit dem Kommando REMARK werden alle nachfolgenden Anweisungen innerhalb der Zeile als Kommentar gekennzeichnet und nicht ausgeführt:
Bsp:
REMARK Monatlicher Report.
2) "--"
Ähnlich wie die REMARK - Anweisung werden bei "--" alle nachweisenden Anweisung innerhalbe dieser Zeile auskommentiert.
3) '/* .... */'
Um Blöcke an Statements auszukommentieren, bietet sich die Anweisung '/* .... */' an. Mit '/* ' wird der Begin des Kommentarblocks angezeigt und '*/' definiert das Ende des Kommentars. Alle Anweisungen innerhalb dieser zwei Marker, werden dann nicht ausgeführt.
Leider ist '/* ... */ ' etwas problematisch und hat mich schon mehrere Stunden gekostet. Es wird nämlich nur dann als Kommentar gewertet, wenn dem '/* ' ein Leerzeichen folgt. Folgt jedoch kein Leerzeichen, so wird der "/" als Anweisung gewertet, die im SQL*Plus Puffer gespeicherte Anweisung auszuführen.
Auf Deutsch: Falls kein Leerzeichen folgt, wird die letzte ausgeführte Anweisung nochmal ausgeführt. Ich weiß ja nicht, wer sich so einen Parser hat einfallen lassen, aber das ist einfach großer Mist.
Ich habe z.B. verschiedene Delta-Scripte, die Tabellen verändern müssen. Nehmen wir ein einfaches Beispiel:
CREATE TABLE name
(
vorname VARCHAR2(32) NOT NULL,
nachname VARCHAR2(32) NOT NULL
)
;
Hier wird eine Tabelle name angelegt, die die 2 Spalten Vorname und Nachname enthält. Angenommen man möchte jetzt diese Tabelle im Nachhinein ändern. Beispielsweise eine Spalte löschen, so kann man das so machen:
ALTER TABLE name DROP COLUMN nachname;
/*Das ist ein blöder Kommentar*/
COMMENT ON COLUMN name.vorname IS 'Vorname';
Man beachte die Kommentarzeile. Führt man diese Anweisung jetzt mit sqlplus aus, so wird sie fehlschlagen:
CODE:
Verbunden mit:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production
Tabelle wurde geändert.
ALTER TABLE name DROP COLUMN nachname
*
FEHLER in Zeile 1:
ORA-00904: "NACHNAME": invalid identifier
Kommentar wurde angelegt.
SQL>
Sehr schön sieht man, dass das ALTER-Statement 2 mal ausgeführt wird, wenn man sich alle Statements noch mal anzeigen lässt:
-- Alle Statements vor Ausführung noch anzeigen lassen
SET echo ON
ALTER TABLE name DROP COLUMN nachname;
/*Das ist ein blöder Kommentar*/
COMMENT ON COLUMN name.vorname IS 'Vorname';
Wenn dieses Script jetzt mit sqlplus ausgeführt wird, sieht man schön, wie
Oracle versucht, das ALTER Statement 2 mal auszuführen:
CODE:
Verbunden mit:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production
SQL> ALTER TABLE name DROP COLUMN nachname;
Tabelle wurde geändert.
SQL> /*Das ist ein blöder Kommentar*/
ALTER TABLE name DROP COLUMN nachname
*
FEHLER in Zeile 1:
ORA-00904: "NACHNAME": invalid identifier
SQL> COMMENT ON COLUMN name.vorname IS 'Vorname';
Kommentar wurde angelegt.
SQL>
Und um zu zeigen, dass es mit einem Leerzeichen funktioniert, hier noch der Beweis:
SET echo ON
ALTER TABLE name DROP COLUMN nachname;
/* Das ist ein blöder Kommentar*/
COMMENT ON COLUMN name.vorname IS 'Vorname';
CODE:
Verbunden mit:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production
SQL> ALTER TABLE name DROP COLUMN nachname;
Tabelle wurde geändert.
SQL> COMMENT ON COLUMN name.vorname IS 'Vorname';
Kommentar wurde angelegt.
SQL>
Das bestätigt auch das
sqlplus Handbuch:
QUOTE:
Using /*...*/
Enter the SQL comment delimiters, /*...*/, on separate lines in your command file, on the same line as a SQL command, or on a line in a PL/SQL block.
You must enter a space after the slash-asterisk(/*) beginning a comment, otherwise the comment is treated as a command, and the slash is interpreted as an execute command, executing any command in the SQL*Plus buffer.
Das witzige daran war, dass diese Scripte lokal im
Toad durchaus getestet wurden und auch funktionierten. Nur wenn man sie dann während des Releasevorgangs auf den Produktivsystemen ausführt, brechen sie ab und hinterlassen das System und die Daten unter Umständen in einem inkonsistenten Zustand. Sehr subtil.
Wie kann man sowas eigentlich designen? Die Suche, warum so ein ähnliches ALTER-Script im Toad funktioniert, aber nicht innerhalb sqlplus hat mich schon mehrere Stunden gekostet.
Den Rant über die Oracle Entwickler spare ich mir jetzt mal.