Letztens fragte mich ein Kollege, wie war das noch einmal mit SQLcl? Ich weiss zwar, dass es ein Oracle Commandline Tool ist, aber wozu kann man es verwenden? Welche Funktionen gibt es denn?
Seit Anfang Juli ist nun auch die Version 21.2 verfügbar, und es gibt wieder einige interessante Neuigkeiten. Grund genug ein Posting zu SQLcl herauszugeben, um nicht nur die neuen Funktionen sondern auch um einige Beispiel zum “alten” Funktionsumfang aufzuzeigen.
Oracle SQLcl (kurz für Oracle SQL Developer Command Line) ist im Unterschied zu SQL*Plus, dem mitgelieferten Standard SQL Tool der Oracle Datenbank, ein weiteres Oracle SQL Tool mit vielen interessanten Eigenschaften und Schnittstellen. Oracle SQLcl ist ein Java-basierte Commandline Tool für die Oracle Datenbank. Mit SQLcl können SQL- und PL/SQL- Befehle interaktiv oder als Batch-Datei ausgeführt werden. Zur Basis Funktionalität gehört Inline-Editierung, automatische Vervollständigung, die History Funktionalität und das Ausführen von SQL*Plus-Skripten. Bald gibt es für SQLcl ein 5 jähriges Jubiläum, da es seit Herbst 2016 zur Verfügung steht. Installation und Konfiguration ist wie bei SQL Developer und den Instant Clients ganz einfach: Nur ein Download der aktuellen zip-Datei und das Auspacken sind dazu erforderlich. Die aktuelle Version von SQLcl findet sich auf der Produktseite von oracle.com und ist im Bundle mit SQL Developer, Oracle Database, OCI Cloud Shell, OCI Linux Yum Repository und dem OCI Developer Image auf dem Market Place erhältlich.
Übrigens ist SQLcl unter die “Oracle Free Use Terms and Conditions License” Bestimmungen gefallen. Das bedeutet. dass das Tool jetzt auch ohne manuelle Zustimmung heruntergeladen werden kann um automatisierte Downloads zu ermöglichen. Mittlerweile gibt es auch eine Datei mit Namen sqlcl-latest.zip, die immer die aktuellste Version enthält. Damit ist es einfach möglich, die letzte freigegebene Version des Tools automatisch herunterzuladen. Der Pfad zu dieser zip-Datei lautet: https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-latest.zip
Exzellente Beiträge in englischer Sprache zum Thema SQLcl findet man mit gängigen Internet-Suchmaschinen oder auf Twitter,, wenn man nach Einträgen der Produktmanager Jeff Smith, Kris Rice oder Gerald Venzl sucht. Am Ende dieses Beitrags sind einige Postings verlinkt.
Wie startet man mit SQLcl? Nutzt man Oracle Cloud Shell kann man sofort starten und einfach sql /nolog nach dem Cloud Shell Prompt eintippen.
Bild 1: SQLcl in der Cloud Shell
Oder man lädt sich die aktuelle zip-Datei, entpackt diese und startet zum Beispiel in einer Linux oder Windows Umgebung. Möchte man einen Überblick über die Funktionen bekommen, gibt man zuerst einmal das Kommando help ein.

Bild 2: SQLcl in der Windows Umgebung: Anzeige aller Kommandos
Wie man am Umfang der Kommandos erkennen kann, ist SQLcl mittlerweile zu einem mächtigen Werkzeug mit vielen Schnittstellen herangewachsen. Einige Kommandos sind sicherlich den SQL*Plus Anwendern bekannt, wie zum Beispiel: SET, CONNECT, DEFINE, EDIT, SHOW, SAVE, SPOOL, REMARK, LIST, RUN, START etc. Aber es gibt noch weitere Kommandos, die beim Skripten und Arbeiten mit SQL sehr hilfreich sind.
Grundsätzlich gilt: Mit help <Kommando> wird eine Beschreibung und die Syntax des Kommandos ausgegeben, mit show <Kommando> kann man sich die aktuellen Einstellungen ansehen. Voreinstellungen wie zum Beispiel ALIAS- und SET-Einstellungen für alle SQLcl Sessions kann man in einer login.sql speichern. Die Umgebungsvariable SQLPATH verweist auf das Verzeichnis, in dem sich die login.sql befindet.
C:\Data\sqlcl\sqlcl\bin>sql /nolog Picked up JAVA_TOOL_OPTIONS: -Duser.language=de SQLcl: Release 21.2 Production auf Di Jul 06 15:06:58 2021 Copyright (c) 1982, 2021, Oracle. All rights reserved. Alle Rechte vorbehalten. SQL> show sqlpath SQLPATH : C:\Data\sqlcl\sqlcl\bin\;.;C:\DATA\sqlcl
Einige interessante Anwendungen mit SQLcl beschreiben wir in den folgenden Abschnitten. Zur leichteren Verwendung sind die einzelnen Kapiteleinstiege verlinkt.
- Connection mit Autonomous Database
- Dienstprogramm OERR
- Informationen über Datenbank-Objekte
- Ausgabe-Formatierung
- Database Schema Änderungen mit Liquibase
- JSON mit der SODA-Schnittstelle
- Statusbar, Editor vi und Syntax-Highlighting
Connection mit Autonomous Database
Das Verbinden mit einer Autonomous Datenbank funktioniert ganz einfach mit dem Kommando set cloudconfig. Man lädt sich das zugehörige Instance-Wallet zuerst herunter und verweist mit dem set cloudconfig Kommando auf das entsprechende Wallet.zip-Verzeichnis.
C:\Data\sqlcl\sqlcl\bin>sql /nolog SQLcl: Release 21.2 Production on Mon Jul 05 13:51:15 2021 Copyright (c) 1982, 2021, Oracle. All rights reserved. SQL> set cloudconfig c:\Data\sqlcl\sqlcl\bin\Wallet_DBJUN_neu.zip SQL> connect admin/Monchen__223344@dbjun_medium Connected.
Dienstprogramm OERR
Für diejenigen die OERR (Oracle ERRor message facility) nicht kennen: OERR ist ein Oracle-Dienstprogramm, das mit der Datenbank Software auf Unix Plattformen installiert wird und Fehlermeldungen mit Vorschlägen zur Behebung aus den Standard-Oracle-Message-Dateien extrahieren kann. Es gibt auch eine Schnittstelle in SQLcl dazu. Verwendet man die Option -v erhält man darüber hinaus auch die Informationen über das Datenbank Release.
SQL> oerr -v 19.3 SQL> oerr ora 2250 02250. 00000 - "missing or invalid constraint name" *Cause: The constraint name is missing or invalid. *Action: Specify a valid identifier name for the constraint name.
Informationen über Datenbank-Objekte
Schnell einmal Informationen zu einer Tabelle erhalten, geht im SQLcl ganz einfach. Mit ddl beispielsweise wird das zugehörige DDL Script ausgegeben; mit information oder info erhält man Details zu einer Tabelle und ihren Spalten.
SQL> info dept
TABLE: DEPT
LAST ANALYZED:2021-06-10 13:27:46.0
ROWS :4
SAMPLE SIZE :4
INMEMORY :DISABLED
COMMENTS :
Columns
NAME DATA TYPE NULL DEFAULT COMMENTS
*DEPTNO NUMBER(2,0) No
DNAME VARCHAR2(14 BYTE) Yes
LOC VARCHAR2(13 BYTE) Yes
Indexes
INDEX_NAME UNIQUENESS STATUS FUNCIDX_STATUS COLUMNS
________________ _____________ _________ _________________ __________
ADMIN.PK_DEPT UNIQUE VALID DEPTNO
Möchte man das DDL-Kommando ohne Segment-Informationen generieren, kann man vorab eine entsprechende set ddl Einstellung absetzen.
SQL> set ddl segment_attributes off
DDL-Option SEGMENT_ATTRIBUTES off
SQL> ddl scott.dept
CREATE TABLE "SCOTT"."DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14) COLLATE "USING_NLS_COMP",
"LOC" VARCHAR2(13) COLLATE "USING_NLS_COMP",
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
USING INDEX ENABLE
) DEFAULT COLLATION "USING_NLS_COMP" ;
SQL>
Ausgabe- Formatierung
Die Möglichkeiten der Ausgabe-Formatierung mit SET SQLFORMAT sind vielfältig – sei es HTML, CSV oder auch JSON. Sogar zugehörige INSERT-Kommandos können damit generiert werden.
SQL> help set sqlformat
SET SQLFORMAT
SET SQLFORMAT { default,csv,html,xml,json,fixed,insert,loader,delimited,ansiconsole}
SQL> set sqlformat JSON
SQL> select empno, ename from emp;
{"results":[{"columns":[{"name":"EMPNO","type":"NUMBER"},{"name":"ENAME","type":"VARCHAR2"}],"items":
[
{"empno":7369,"ename":"SMITH"}
,{"empno":7499,"ename":"ALLEN"}
,{"empno":7521,"ename":"WARD"}
,{"empno":7566,"ename":"JONES"}
...
]}]}
SQL> set SQLFORMAT INSERT
SQL> select empno, ename from emp;
REM INSERTING into EMP
SET DEFINE OFF;
Insert into EMP (EMPNO,ENAME) values ('7369','SMITH');
Insert into EMP (EMPNO,ENAME) values ('7499','ALLEN');
Insert into EMP (EMPNO,ENAME) values ('7521','WARD');
Insert into EMP (EMPNO,ENAME) values ('7566','JONES');
...
Database Schema Änderungen mit Liquibase
SQLcl besitzt ab Version 19.2 eine Schnittstelle zu Open Source Liquibase. Zur Erinnerung: Liquibase ist eine datenbankunabhängige Open-Source-Bibliothek für das Management und die Nachverfolgungen von Modifikationen in Datenbankschemata. Insbesondere im Kontext agiler Softwareentwicklung ist sie ausgesprochen hilfreich, weil sie für mehr Transparenz und ein besseres zurückverfolgen von Datenbankänderungen sorgt. Liquibase erlaubt es dem Entwickler, sogenannte Changesets für die Datenbank zu schreiben. Die Changesets werden dann der Reihe nach eingelesen und ausgeführt. Liquibase überwacht dabei, welche Changesets bereits ausgeführt worden sind.
Mit der Liquibase-Funktion in SQLcl kann man Befehle ausführen, um ein Changelog für ein einzelnes Objekt oder für ein ganzes Schema (Changeset und Changelogs) zu erzeugen. Diese Objekte kann man dann auch manuell mit SQLcl oder über eine der traditionellen Liquibase-Schnittstellen bearbeiten. Um Liquibase zu verwenden, nutzt man das Kommando lb oder liquibase mit den entsprechenden Optionen. Ein einfaches Beispiel soll die Erzeugung eines Changelogs demonstrieren, um eine Tabelle EMP in einem weiteren Datenbank Schema anzulegen.
Folgendes Beispiel legt die Changelog-Datei für das Objekt EMP an. Die Changelog-Dateien liegen im XML-Format vor.
SQL> lb genobject -type table -name emp Action successfully completed please review created file emp_table2.xml
Changelog-Dateien für das gesamte Schema lassen sich folgendermaßen generieren.
SQL> lb genschema
[Method loadCaptureTable]:
Executing
[Type - TYPE_SPEC]: 91 ms
[Type - TYPE_BODY]: 62 ms
[Type - SEQUENCE]: 44 ms
[Type - DIRECTORY]: 45 ms
[Type - CLUSTER]: 924 ms
[Type - TABLE]: 562 ms
[Type - MATERIALIZED_VIEW_LOG]: 45 ms
[Type - MATERIALIZED_VIEW]: 33 ms
[Type - VIEW]: 148 ms
...
Nun verbinden wir uns mit einem anderen User, der keine EMP Tabelle besitzt und wenden die Changelog-Datei zum Anlegen der Tabelle EMP an .
SQL> desc emp ERROR: ORA-04043: Objekt emp ist nicht vorhanden SQL> lb update -changelog emp_table2.xml ScriptRunner Executing: emp_table2.xml::b618761d0c538606b8b0eb7a59b70c91224e1ec8::(SCOTT)-Generated -- DONE ######## ERROR SUMMARY ################## Errors encountered:0 ######## END ERROR SUMMARY ################## SQL> desc emp Name Null? Typ -------- -------- ------------ EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2)
Weitere Beispiele und umfangreiche Erläuterungen finden sich im Handbuch im Kapitel Liquibase Support in SQLcl
JSON mit der Soda-Schnittstelle
SODA (kurz für Simple Oracle Document Access) ermöglicht eine schemalose Anwendungsentwicklung unter Verwendung des JSON-Datenmodells. Wie immer zeigt help soda alle Möglichkeiten der Verwendung in SQLcl auf.
Wir haben einige Postings zum Thema SODA in der Oracle Datenbank auf unserer deutschsprachigen Blog Plattform veröffentlicht. So hat mein Kollege Marcus Schröder einige Beispiele in seinem Beitrag
Simple Oracle Document Access (SODA) ausprobieren? dazu veröffentlicht. Daher zeige ich an dieser Stelle nur ein paar kurze Beispiele zum Anlegen und Auflisten einer Collection und Einfügen von JSON.
SQL> soda list
List of collections:
PURCHASEORDERS
empcol
SQL> soda create employees
Successfully created collection: employees
SQL> desc employees
Name Null? Type
------------- -------- -------------
ID NOT NULL VARCHAR2(255)
CREATED_ON NOT NULL TIMESTAMP(6)
LAST_MODIFIED NOT NULL TIMESTAMP(6)
VERSION NOT NULL VARCHAR2(255)
JSON_DOCUMENT BLOB
SQL> soda list
List of collections:
PURCHASEORDERS
empcol
employees
SQL> soda insert employees {"name" : "SMITH", "department" : 20}
JSON document inserted successfully.
Statusbar, Editor vi und Syntax-Highlighting
Jetzt ist es endlich soweit: Mit SQLcl kann man Highlighting und jetzt auch vi Funktionen verwenden :). In der aktuellen Version 21.2 sind diese Funktionen eingearbeitet worden. Für ein Hervorheben (auch Highlighting) benötigt man die Einstellung highlighting, für die Verwendung von vi-Funktionen die Einstellung statusbar. Wie immer kann man mit help und show die aktuellen Einstellungen bzw. die Verwendungsmöglichkeiten ausgeben.
SQL> show highlighting
HIGHLIGHTING: off
SQL> help set highlighting
set highlighting
|
RESET
|
FOREGROUND
|
BACKGROUND
|
BOLD
|
ULINE
|
INVERSE
= DEFAULT | COMMENT | STRING | NUMBER | PUNCTUATION | KEYWORD | IDENTIFIER
= RED | BLUE | BLACK | CYAN | GREEN | MAGENTA | WHITE | YELLOW
= ON | OFF | RESET SQL> set highlighting on SQL> set highlighting keyword foreground red
Und schon kann es losgehen: alle Schlüsselwörter sind jetzt in roter Farbe.
Möchte man Kommandofunktionen von vi oder emacs verwenden, ist die Verwendung der Statusanzeige erforderlich. Die Standardanzeige informiert über den verwendeten Modus wie zum Beispiel viins oder vicmd, die Zeilen- und Spaltenposition des Cursors, den aktuellen User und den verwendeten Servicenamen. Folgender Screenshot zeigt ein Beispiel mit eingeschalteter Default Status-Anzeige.

Bild 3: Syntax Highlighting und Statusbar
Es gibt natürlich noch weitere sinnvolle Einstellungen. So kann man das Timing und den Transaktionsstand anzeigen.
set statusbar add TXN set statusbar add TIMING
Und das Ergebnis sieht dann zum Beispiel so aus.

Bild 4: Status-Anzeige mit Timing und TXN
Mehr dazu auch mit animierten GIFs findet sich im Posting von Jeff Smith unter Oracle SQLcl: Syntax Highlighting and the Status Bar.
Fazit
SQLcl steht schnell und einfach zur Verfügung und ist für “Liebhaber” von Linemode Werkzeugen eine gute Wahl, wenn es um das Entwickeln und Arbeiten mit der Oracle Datenbank geht. SQLcl kann natürlich noch viel mehr als im Blogeintrag gezeigt werden konnte. So gibt es weitere Schnittstellen zu Javascript, ORDS, APEX, SQL Developer Data Modeler, Property Graph Query Language (PGQL) und natürlich auch zu OCI und Cloud Object Storage. Beispielskripte sind auf Github oder in zahlreichen Blogeinträgen zu finden. Am Besten dazu im Internet recherchieren oder die aufgeführten Links verwenden. Es lohnt sich übrigens wie bei den anderen downloadbaren Oracle Tools – SQL Developer oder Instant Clients – die aktuelle Version zu verwenden, um von einem Maximum an Funktionalität zu profitieren. Also gleich downloaden und die aktuelle Version ausprobieren :).
Informationen und Links
- Dokumentation
- Download von https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-latest.zip
- oracle.com Produktseite
- Jeff Smith: Oracle SQLcl: Syntax Highlighting and the Status Bar
- Gerald Venzl: SQLcl now under the Oracle Free Use Terms and Conditions license
- Jeff Smith: SQLcl version 20.3 and OCI Support
- Deutschsprachige Blogs:
– unser allererstes Posting mit Lieblingskommandos: Oracle SQL Developer (SQLcl)
– Did you already know: Testtabellen erzeugen mit SQLcl
