Hinweis: Eine aktuellere Version mit Oracle 23c finden Sie im Artikel rlwrap für SQLPLUS mit Oracle 19c/21c/23c Syntax auf RHEL/OL 7/8/9.
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 es nichts - oder? Drei Funktionen wären hilfreich: Commandline Editing (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 Kommando!) 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): rlwrap
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 nicht in jedem Betriebssystem als Paket erhältlich 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 oder bei GitHub: https://github.com/hanslub42/rlwrap.
rlwrap und Oracle 19c Update
Wir haben rlwrap jetzt um completion für Oracle 19c erweitert und in ein einziges Distributionsfile zusammen gefasst. Sie müssen nur noch die aktuelle Version herunter laden, in $HOME Ihres Benutzers entpacken und direkt mit $HOME/bin/sql+ oder $HOME/bin/asm+ loslegen.
SQLcl
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. Seit Oracle 12cR2 war es fixer Bestandteil der Datenbank Distribution als $ORACLE_HOME/sqldeveloper/sqlcl, ab Oracle 18c unter $ORACLE_HOME/sqldeveloper/sqldeveloper/bin/sql.
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 Fehlermeldungs-Orgien und Verwicklungen, die sich durch diverse Java-Version ergeben. Es macht aber sonst einen recht stabilen Eindruck. Es gab anfangs noch kleinere Inkompatibilitäten, so verstand es bei der COLUMN-Anweisungen lange keine 1000er-Trennzeichen (,) und auch keine Spaltennamen, die '#' oder '$' enthalten. Das letztere scheint noch immer (Stand 11.11.2020) nicht behoben zu sein. Auch die äußerst praktische Suchfunktion ^R der Readline Library in rlwrap 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.