Home > SQL Scripts und Tools > SQL*Plus Command Line History

SQL*Plus Command Line History

Seit es bei Oracle SQL*Plus gibt, hadern viele User (zumindest unter Unix) mit einem Problem: Die Cursortasten funktionieren nicht!
Besser gesagt: So manch mühsam eingetipptes langes Kommando möchte man ein zweites Mal eingeben, um den Tippfehler am Anfang zu korrigieren, doch dafür gibt nichts - oder? Drei Funktionen wären hilfreich: Commandline Editing (also, dass die Cursortasten funktionieren), Commandline History (zurückblättern in den Kommandos) und Name Completion (automatisches Ergänzen von Schlüsselwörtern).

Die eingebaute Abhilfe

Seit jeher beherrscht SQL*Plus die Kommandos (E)dit, (A)ppend, (C)hange usw, mit denen man mit Methoden, die ungefähr aus 1970 stammen, das letzte SQL-Kommando (nicht SQL*Plus Kommandos!) editieren kann. Noch dazu benutzt Oracle als Default-Editor unter Unix den Editor ed, der an Bedienerfreundlichkeit nicht einmal mehr vom klassischen Wiener Oberkellner im Kaffeehaus unterboten werden kann. Steinzeit, also.
Gut, das kann man ändern: Entweder man belegt die Environment-Variable EDITOR mit etwas Sinnvollem (vi comes to the mind, aber auch gedit für die weniger masochistisch Veranlagten geht - halt nur mit grafischer Oberfläche), oder man setzt den Editor mittels DEFINE im SQL*Plus direkt:

DEFINE _editor=vi

Perfekt ist das aber alles noch nicht, denn eine echte History  und Name Completion sucht man noch immer vergebens.

Lösungen für das Problem gibt es schon länger.

Die beinahe eingebaute Abhilfe (Windows)

Unter Windows pfuscht bereits das Betriebssystem in die Applikationen hinein, und deswegen gibt es dort automatisch Cursortatsten und eine kurze  History, allerdings nur über nicht einmal 50 Einträge - aber, besser als nix.

Die externe Abhilfe (Unix)

Unter Unix (und damit ist natürlich auch Linux gemeint)  gibt es schon seit mindestens dem Jahr 2001 ein kleines Programm namens rlwrap, dass der Niederländer Hans Lub geschrieben hat. Es basiert auf der readline Library der bash und versorgt so jedes beliebige Programm, das zeilenorientierten Input verlangt (SQL*Plus, rman, adrci, asmcmd, ...), mit guten Editierfunktionen und einer Commandline History. Es ist noch dazu auch recht flexibel und hat daher schon lange eine treue Anhängerschaft. Mit ein paar zusätzlichen Textfiles als Ergänzungen kann man es auch um Schlüsselwortdateien erweitern und hat dann eine recht gute Name Completion.

Als Nachteil muss man erwähnen, dass es meist nicht im Betriebssystem installiert ist, und aus den Quellen übersetzt werden muss. Keine Hexerei, aber man braucht einen C-Compiler und die Developer-Version der Readline Library und der ncurses Library. Bis auf den C-Compiler lässt sich das alles mittels Sourcecode einfach nachrüsten und man braucht nicht unbedingt root-Berechtigung.

Leider hat sich seit Dezember 2016 die Hompage von Hans Lub ins Nirwana verabschiedet - aber rlwrap gibt es auch an anderen Stellen. Zum Beispiel bei uns.

Im Jahr 2014 haben die Entwickler des SQLDevelopers einen Ersatz für SQL*Plus geschrieben: sqlcl. Es verhält sich annähernd wie SQL*Plus mit eingebauter Command Line History und Name Completion, die auf das Data Dictionary zugreift!
Man kann es hier herunterladen.
Da es (erwartungsgemäß) in Java geschrieben ist, läuft es unter jedem Betriebssystem. Sein größter Nachteil: Es ist in Java geschrieben. Mit all den grässlichen Fehlermeldungsorgien und Verwicklungen, die sich durch diverse Java-Version ergeben. Es macht aber sonst einen recht stabilen Eindruck - mal sehen, ob Oracle es weiter unterstützt.
Es hat noch kleinere Inkompatibilitäten, so versteht es bei der COLUMN-Anweisungen keine 1000er-Trennzeichen (,) und auch keine Spaltennamen, die '#' oder '$' enthalten. Auch die äußerst praktische Suchfunktion ^R der Readline Library beherrscht das Tool nicht.

Neu in Oracle12cR2

Mit Oracle 12cR2 gibt es eine atemberaubende Meldung: SQL*Plus kennt jetzt eine History! Genauer gesagt, es gibt die Kommandos SET HISTORY ON|OFF und SHOW HISTORY. Sobald man SET HISTORY ON abgesetzt hat, kann man die letzten 100 Kommandos auflisten - mehr aber nicht. Man kann nur die Anzahl der aufgehobenen Statements verändern, mit SET HIST 200 zum Beispiel. Ein Anfang, aber nicht mehr.
Interessant wäre natürlich, wenn Oracle es fertig brächte, etwas wie die readline Library in seine Commandline Tools einzubinden. Aber das scheint noch immer Zukunftsmusik zu sein.

Fazit

Wer absolute Kompatibilität mit Komfort verbinden will, wird rlwrap mit SQL*Plus kombinieren, wer gerne experimentiert, sollte sich sqlcl anschauen, und wem das alles nicht bunt genug ist - für den gibt es ja noch immer den SQLDeveloper.