web-dev-qa-db-de.com

einfügen einer mehrzeiligen Zeichenfolge in Oracle mit sqlplus

Ich habe ein SQL-Skript, das eine lange Zeichenfolge in eine Tabelle einfügt. Die Zeichenfolge enthält eine neue Zeile (und diese neue Zeile ist unbedingt erforderlich). Wenn sie also in eine Textdatei geschrieben wird, wird die Abfrage in mehrere Zeilen aufgeteilt. So etwas wie:

insert into table(id, string) values (1, 'Line1goesHere 

Line2GoesHere 
blablablabla
');

Dies läuft in Toad in Ordnung, aber wenn ich diese als .sql-Datei speichere und sie mit sqlplus ausführe, wird jede Zeile als separate Abfrage betrachtet, was bedeutet, dass jede Zeile fehlschlägt (beacuse insert into table(id, string) values (1, 'Line1goesHere, Line2GoesHere sind keine wohlgeformten Skripts.

SP2-0734: unknown command beginning "Line2GoesHere" - rest of line ignored.

Gibt es eine Möglichkeit, dies zu beheben?

29
Louis Rhys

Aktivieren Sie SQLBLANKLINES, um Leerzeilen in SQL-Anweisungen zuzulassen. Zum Beispiel:

SET SQLBLANKLINES ON
insert into table(id, string) values (1, 'Line1goesHere 
Line2GoesHere 

blablablabla
');

Die Prämisse dieser Frage ist etwas falsch. SQL * Plus erlaubt standardmäßig mehrzeilige Zeichenfolgen. Es sind nur leere Zeilen, die Probleme verursachen.

49
jim mcnamara

Sie können auch eine nicht bekannte Funktion der SQL-Zeichenfolgen von SQL: Perl verwenden.

SQL> select q'[f dfgdfklgdfkjgd
  2  sdffdslkdflkgj dglk
  3  glfdglkjdgkldj ]'
  4  from dual;

Q'[FDFGDFKLGDFKJGDSDFFDSLKDFLKGJDGLKGLFDGLKJDGKLDJ]'
----------------------------------------------------
f dfgdfklgdfkjgd
sdffdslkdflkgj dglk
glfdglkjdgkldj
6
ibre5041

SQL * Plus-Handbuch

Sie können einen SQL-Befehl auf drei Arten beenden:

  1. mit einem Semikolon (;)
  2. mit einem Schrägstrich (/) in einer eigenen Zeile
  3. mit einer leeren Zeile

Eine leere Zeile in einer SQL-Anweisung oder einem SQL-Skript teilt SQL * Plus mit, dass Sie über .__ verfügen. Die Eingabe des Befehls ist abgeschlossen, Sie möchten ihn jedoch noch nicht ausführen. Drücken Sie Rückkehr am Ende der letzten Zeile des Befehls.

Das Aktivieren von SQLBLANKLINES in dieser Situation mag die Antwort sein, aber selbst dann müssen Sie sich um die folgenden SQL * Plus-Befehle kümmern.

@  ("at" sign)        (Start of line) 
@@ (double "at" sign) (Start of line) 
#   SQLPREFIX         (Start of line)
.   BLOCKTERMINATOR   (Start of line and by itself)
/  (slash)            (Start of line and by itself)
;   SQLT[ERMINATOR]   (Start of line and by itself, or at the end)

SQLPREFIX ist etwas, das Sie nicht deaktivieren können. Es ist eine Funktion von SQL * Plus. BLOCKTERMINATOR kann aktiviert oder deaktiviert werden. Wenn der Schrägstrich dagegen am Anfang einer neuen Zeile erscheint, führt er den Inhalt im Puffer aus. SQL [TERMINATOR] verhält sich ähnlich.

3
Chad

Eine weitere Möglichkeit, Zeilenumbrüche in einen String einzufügen, ist die Verkettung: 

chr(13)||chr(10)

(unter Windows)

oder nur: 

chr(10)

(Andernfalls)

0
A.B.Cade