Gelegentlich erhalte ich ein Skript, das in SQL Developer oder Toad problemlos ausgeführt werden kann, das jedoch geändert werden muss, damit es erfolgreich in SQL * Plus ausgeführt werden kann. Hier ist ein Worst-Case-Beispiel mit mehreren Anweisungen, die jeweils Leerzeilen, Semikolons und Schrägstriche enthalten:
INSERT INTO t1 VALUES ('a
;
/
');
INSERT INTO t1 VALUES ('b
;
/
');
DELETE FROM t1 WHERE c1 = 'c
;
/
';
Aus verschiedenen Gründen müssen diese Anweisungen in SQL * Plus ausgeführt werden. Die Leerzeilen lassen sich mit einem einfachen ...
set sqlblanklines on
Mir ist bewusst, dass das sqlterminator
geändert und / oder deaktiviert werden kann, aber beide Änderungen am Code erfordern würden. Ersteres verschiebt das Problem, ohne es zu beheben, und behebt auch nicht das Problem mit dem eingebetteten Schrägstrich.
Die beste Antwort wäre eine Möglichkeit, die Ausführung dieser Anweisungen ohne Änderung zuzulassen, indem die Umgebung auf irgendeine Weise geändert wird (wie dies bei sqlblanklines der Fall ist). Wenn dies nicht möglich ist, können Sie die Skripte möglicherweise programmgesteuert ändern. Ich versuche manuelle Änderungen zu vermeiden.
quelle
Antworten:
Das meiste können Sie mit login.sql erledigen. login.sql wird während der - überraschenden - Anmeldung ausgeführt und aus Ihrem SQLPATH oder dem aktuellen Verzeichnis geladen. Für die Beispiele, die Sie gegeben haben, haben Sie wirklich den schlechtesten Fall gewählt.
Problem ist der sqlterminator. Was auch immer Sie dort einfügen, der Schrägstrich wird als kostenloser SQL-Minimator beibehalten. Darüber hinaus sucht sqlplus zuerst nach dem sqlterminator und führt dies durch, bevor zum Zeichenfolgenabschluss gescannt wird. Ein Fehler, wenn Sie mich fragen. Der Schrägstrich kann in einer Zeichenfolge verwendet werden, solange er nicht in einer separaten Zeile steht. Sobald sqlplus das als sqlterminator angegebene Zeichen findet, ignoriert es alles andere und hört auf zu lesen.
Der Schrägstrich kann behandelt werden, solange er nicht alleine in einer Zeile steht.
login.sql enthält:
leigh.sql enthält:
Führen Sie das Skript aus:
Keine Notwendigkeit, mit Anfangs- / Endblöcken zu fummeln. Kann sqlterminator im Befehl nicht verarbeiten, egal wo es sich in einer Zeichenfolge befindet oder nicht, kann keine Zeilen mit Schrägstrich allein in einer Zeile in einer Zeichenfolge verarbeiten.
quelle
Das Einfügen von Anweisungen mit Leerzeilen und Semikolons ist erfolgreich, wenn sie in BEGIN ... END-Blöcken platziert werden. Diese Änderung könnte mit einem Skript durchgeführt werden, aber das Skript würde fehlschlagen, wenn es DDL-Anweisungen enthält, die nicht in einem Block ausgeführt werden können, ohne sofort ausgeführt zu werden.
Diese Lösung behebt auch nicht das eingebettete Problem.
quelle
Mein Workaround:
Es scheint, als würde das Befehlsende in der body-Anweisung ignoriert.
quelle
quelle