Logo Oracle Deutschland November 2016
Oracle SQL Developer Command Line (SQLcl)
Ulrike Schwinn

Seit September steht das neue Werkzeug Oracle SQL Developer Command Line (kurz SQLcl) zum Download von OTN zur Verfügung. Am 3. November gab es das erste Update dazu, das einige Bugfixes und kleinere neue Features enthält (siehe Release Notes unten). Grund genug, dass wir einen kleinen Bericht zu dem Thema publizieren. Wozu eignet sich SQLcl? SQLcl könnte man als "kleinen" Bruder des graphischen Werkzeugs SQL Developer bezeichnen: Es vereinigt dabei die Vorteile eines Linemode Werkzeugs mit den Features von SQL Developer. Da die Software von SQLcl schon seit geraumer Zeit im sogenannten "Early Adopter" Status zur Verfügung stand, gibt es auch schon Einiges dazu im Web zu lesen - nicht zuletzt auch vom SQL Developer Produktmanagement (siehe Informationen unten). In den folgenden Abschnitten will ich daher einige Grundlagen vermitteln und einige meiner Lieblingsfunktionen an kurzen Beispielen demonstrieren. Ansonsten gilt besonders auch hier - einfach selbst einmal ausprobieren.

Installation und Grundlagen

SQLcl Release 4.2 ist auf Windows 7, 8, 10 und Windows Server 2008/2012, Linux und Mac OS X verfügbar. Die vollständige Liste der Zertifizierung findet sich unten im letzten Kapitel. Voraussetzung zur erfolgreichen Nutzung ist zudem noch die Java Runtime Engine (JRE) 8. Die Installation ist dann ähnlich wie bei SQL Developer: Einfach Zip Datei von OTN laden und in einen leeren Folder auspacken. Die Zip Datei hat dabei eine Größe von 17 MB. Nun startet man das Programm SQL aus dem Verzeichnis "\bin" in einer Terminal cmd Session und schon kann es losgehen.
Hinweis: Übrigens alle neuen Release von SQLcl erfordern eine Vollinstallation - also Download und Unzip in ein leeres Verzeichnis.

Hat man SQLcl installiert, will man sich natürlich im ersten Schritt mit einer Datenbank verbinden. Auch hier gilt Ähnliches wie bei SQL Developer: Eine Connection kann in der Regel über einen Datenbank Service Namen, falls eine SQL Net tnsames.ora vorhanden ist oder über die Easy Connect Naming Methode erfolgen. Zur Wiederholung gebe ich hier noch einmal die Syntax der Easy Connect Naming Methode an: CONNECT username/@host[:port][/service_name][:server][/instance_name]. Folgendes Beispiel zeigt eine Verbindung mit dem Benutzer SCOTT.

Möchte man sich mit einem Oracle Datenbank Cloud Service verbinden, funktioniert das Verbinden im Prinzip ebenso. Das Einzige was vorab erforderlich ist, ist ein SSH Tunneling vorzunehmen. Dazu ist ein SSH Schlüsselpaar erforderlich. Unser Tipp "Public Database as a Service - Konzepte und Grundlagen" erklärt die Grundlagen dazu. Das nächste Beispiel demonstriert nun die Verbindung mit einer Database Cloud Service Instance. Das SSH Tunneling wird mit dem SQLcl Befehl sshtunnel durchgeführt. Das help Kommando zeigt dabei die Verwendung.

Nach erfolgreichem SSH Tunneling verwenden wir wiederum die Easy Connect Methode um die Verbindung mit der Datenbank herzustellen.

Vereinfacht wurde hingegen der Verbindungsaufruf mit dem Exadata Express Cloud Service: Hier ist nur die Datei Client_Credentials.zip erforderlich, die nach der Service Erzeugung zum Download verfügbar und mit einem Passwort geschützt ist. Sie enthält neben Wallet Informationen auch Network Files wie tnsnames.ora, sqlnet.ora usw. Hier befindet sich somit auch der Eintrag des Servicenamen. Der Default lautet dbaccess. Bevor man starten kann, muss noch das Verschlüsselungsframework "JCE Unlimited Strength Jurisdiction Policy Files" von OTN geladen und installiert werden. Folgt man dem Readme.txt ist dies ein sehr einfaches Prozedere. Nun kann man loslegen. Mit set cloudconfig wird dann auf die Datei Client_Credentials.zip verwiesen. Abgefragt wird dann noch das Wallet Passwort, das beim Download der Datei angegeben wurde. Danach erfolgt die Verbindung über Username (hier BUDB) und den Servicenamen (hier dbaccess).

Mehr zu SQLcl und Exadata Express Cloud Service kann man im Handbuch (siehe unten) nachlesen.

SQLcl Kommandos - meine Favoriten

Wie oben schon erwähnt gibt es schon Einiges im Internet zum Thema SQLcl zu lesen, daher möchte ich mich auf einige ausgewählte Kommandos konzentrieren, die mir besonders nützlich erscheinen. Zuerst aber das wichtigste Kommando überhaupt - nämlich "help". Das Kommando help ohne Zusatz gibt einen Überblick über alle möglichen SQLcl Kommandos.

Wie man aus der Liste entnehmen kann, unterstützt SQLcl fast alle wichtigen SQL*Plus Kommandos. Die zusätzlich hervorgehobenen Kommandos sind die neuen SQLcl spezifische Kommandos. Die Helpfunktion liefert nicht nur einen Überblick über fast alle verfügbaren Kommandos; sondern gibt auch eine genaue Beschreibung der einzelnen Kommandos. Im oberen Kapitel haben wir dies schon anhand der Funktion sshtunnel demonstriert. Bevor wir uns einige dieser Kommandos genauer ansehen, noch ein paar Informationen zur allgemeinen Nutzung von SQLcl. Wichtig zu wissen ist sicherlich, dass man ohne zusätzlich einen Editor einzubinden innerhalb eines Kommandos beliebig In-Line editieren kann. Dies erleichtert die Angabe natürlich ungemein. Auch gibt es wie bei SQL Developer automatisch eine Historie der Kommandos (bis zu 100). Diese kann entweder mit der Pfeiltaste (nach unten oder oben) oder über das Kommando history erreicht werden. history full zeigt dabei die vollständige Liste, "history mit Zeilenangabe" gibt das entsprechende Kommando aus. Aber schauen wir uns einfach das history Kommando selbst an.
SQL> help history
HISTORY
---------
history [ | FULL | USAGE | SCRIPT | TIME | CLEAR (SESSION)?] | F

SQL>history full
  1  select 1 from dual;
  2  select 2
  >  from dual;
  3  select 3 from dual
  >  where 1=1;

SQL>history usage
  1  (2) select 1 from dual;
  2  (11) select 2 from dual;
  3  (2) select 3 from dual where 1=1;

SQL>history script
 select 1 from dual;
 select 2 from dual;
 select 3 from dual where 1=1;

SQL>history 3
  1  select 3 from dual
  2* where 1=1;

SQL>his time
  1           clear
  2           cl bre
  3  (00.201) select 1 from dual

SQL>his fails
   This determines if the history will show failures or not
Auch abgeschaut vom SQL Developer ist die "Tab Completion" Funktion, die Objektnamen, Schlüsselworte und vieles mehr mithilfe der Tab Taste vervollständigen kann.

Nun zu ein paar Kommandos: oerr beispielsweise gibt wie das Unix Kommandooerr Informationen zu den Oracle Fehlern aus. Die Handhabung ist dabei vergleichbar.
SQL>oerr ora 2290
02290. 00000 -  "check constraint (%s.%s) violated"
*Cause:    The values being inserted do not satisfy the named

*Action:   do not insert values that violate the constraint.
Das Kommando information gibt Informationen über ein Tabellenobjekt aus. Vergleicht man die Ausgabe mit describe, kann man festellen, dass das Resultat, die Beschreibung des Objekts, viel umfangreicher ist. So erhält man nicht nur Informationen über die Spalten, sondern auch über zugehörige Indizes. Auch die Größenordung der Tabelle (Anzahl der Zeilen) wird ausgegeben. Folgendes Beispiel zeigt eine Ausgabe.
SQL>information scott.emp
TABLE: EMP
         LAST ANALYZED:2016-08-18 14:05:02.0
         ROWS         :14
         SAMPLE SIZE  :14
         INMEMORY     :ENABLED
         COMMENTS     :

Columns
NAME         DATA TYPE           NULL  DEFAULT    COMMENTS
*EMPNO       NUMBER(4,0)         No
 ENAME       VARCHAR2(10 BYTE)   Yes
 JOB         VARCHAR2(9 BYTE)    Yes
 MGR         NUMBER(4,0)         Yes
 HIREDATE    DATE                Yes
 SAL         NUMBER(7,2)         Yes
 COMM        NUMBER(7,2)         Yes
 DEPTNO      NUMBER(2,0)         Yes
 T           NUMBER              Yes
 D           NUMBER              Yes

Indexes
INDEX_NAME    UNIQUENESS  STATUS  FUNCIDX_STATUS  COLUMNS  COLUMN_EXPRESSION
SCOTT.PK_EMP  UNIQUE      VALID                   EMPNO
Verwendet man information mit einem Index wird übrigens das verwendete CREATE INDEX Kommando ausgegeben. In unserem Beispiel überprüfen wir den Index SCOTT.PK_EMP.
SQL> info scott.pk_emp

  CREATE UNIQUE INDEX "SCOTT"."PK_EMP" ON "SCOTT"."EMP" ("EMPNO")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"
Das Kommando set ermöglicht wie das analoge SQL*Plus Kommando etliche Voreinstellungen. Einige neue Einstellungen sind in SQLcl hinzugefügt worden. Verwendet man beispielsweise set sqlformat kann die Formatausgabe der nachfolgenden SQL Kommandos beeinflusst werden. Die einfachste Form ist set ansiconsole, mit der die Spaltenausgabe automatisch an die maximale Länge der Zeile angepasst werden, so dass die Ausgabe einfach zu lesen ist.
SQL> help set sqlformat
SET SQLFORMAT
  SET SQLFORMAT { csv,html,xml,json,ansiconsole,insert,loader,fixed,default} 
SQL> set sqlformat ansiconsole
SQL> select * from scott.emp
  2  ;
EMPNO  ENAME   JOB        MGR   HIREDATE  SAL   COMM  DEPTNO  T  D
7369   SMITH   CLERK      7902  17.12.80  800         20
7499   ALLEN   SALESMAN   7698  20.02.81  1600  300   30
7521   WARD    SALESMAN   7698  22.02.81  1250  500   30
7566   JONES   MANAGER    7839  02.04.81  2975        20
7654   MARTIN  SALESMAN   7698  28.09.81  1250  1400  30
7698   BLAKE   MANAGER    7839  01.05.81  2850        30
7782   CLARK   MANAGER    7839  09.06.81  2450        10
7788   SCOTT   ANALYST    7566  19.04.87  3000        20
7839   KING    PRESIDENT        17.11.81  5000        10
7844   TURNER  SALESMAN   7698  08.09.81  1500  0     30
7876   ADAMS   CLERK      7788  23.05.87  1100        20
7900   JAMES   CLERK      7698  03.12.81  950         30
7902   FORD    ANALYST    7566  03.12.81  3000        20
7934   MILLER  CLERK      7782  23.01.82  1300        10


14 rows selected.
Interessant sind sicher auch die Formate LOADER, CSV oder auch INSERT bzw. JSON, HTML und XML, wie in den folgenden Beispielen zu sehen sein wird.

Verwendet man das Kommando ddl in Kombination mit einer SELECT Abfrage und formatiert vorab die Ausgabe mit den entsprechenden SET Kommandos, hat man schnell ein kleines Ladeskript erzeugt. Das Kommando set sqlformat insert beinflusst dabei die Ausgabe der SELECT Abfrage, set ddl segment_attributes off sorgt dafür das keine Segmentattribut Informationen ausgegeben werden.
SQL> set ddl segment_attributes off
DDL Option SEGMENT_ATTRIBUTES off
SQL> set sqlformat insert
SQL> ddl scott.emp
  CREATE TABLE "SCOTT"."EMP"
   (    "EMPNO" NUMBER(4,0),
        "ENAME" VARCHAR2(10),
        "JOB" VARCHAR2(9),
        "MGR" NUMBER(4,0),
        "HIREDATE" DATE,
        "SAL" NUMBER(7,2),
        "COMM" NUMBER(7,2),
        "DEPTNO" NUMBER(2,0),
        "T" NUMBER,
        "D" NUMBER,
         CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
  USING INDEX  ENABLE,
         CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
          REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
   )
  INMEMORY PRIORITY NONE MEMCOMPRESS FOR QUERY LOW
  DISTRIBUTE AUTO NO DUPLICATE ;
SQL> select * from emp fetch first 5 rows only;
REM INSERTING into EMP
SET DEFINE OFF;
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,T,D) values ('7369','SMITH','CLERK','7
902',to_timestamp('17.12.80','DD.MM.RR HH24:MI:SSXFF'),'800',null,'20',null,null);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,T,D) values ('7499','ALLEN','SALESMAN'
,'7698',to_timestamp('20.02.81','DD.MM.RR HH24:MI:SSXFF'),'1600','300','30',null,null);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,T,D) values ('7521','WARD','SALESMAN',
'7698',to_timestamp('22.02.81','DD.MM.RR HH24:MI:SSXFF'),'1250','500','30',null,null);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,T,D) values ('7566','JONES','MANAGER',
'7839',to_timestamp('02.04.81','DD.MM.RR HH24:MI:SSXFF'),'2975',null,'20',null,null);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,T,D) values ('7654','MARTIN','SALESMAN
','7698',to_timestamp('28.09.81','DD.MM.RR HH24:MI:SSXFF'),'1250','1400','30',null,null);
Zum Abschluss möchte ich noch ein weiteres nützliches Kommando demonstrieren: das Kommando repeat. Wie der Name schon andeutet, kann man damit automatisch SQL Kommandos wiederholen. Dabei lässt sich die Gesamtanzahl und die Abstände zwischen den Ausführungen definieren. So kann man einfach die Inhalte einer bestimmten Tabelle überwachen. Interessant zu beobachten ist beispielsweise die View V$SESSION_LONGOPS, die langaufende Statements und Operationen im laufenden Betrieb anzeigt. Die Verwendung von REPEAT erfolgt nach der Ausführung eines Statements. Unser simples Beispiel nutzt die Ausgabe der Funktion systimestamp. Das Kommando soll im Abstand von 1 Sekunde 15 mal ausgeführt werden.
SQL> help repeat
repeat  
        Repeats the current sql in the buffer the specified times with sleep intervals
        Maximum sleep is 120s
SQL> select systimestamp from dual;

SYSTIMESTAMP
----------------------------------
04.11.16 15:09:04,106286000 +01:00
SQL>repeat 15 1
Die dritte Ausführung sieht nun folgendermassen aus.



SQLcl kann aber noch viel mehr als SQL Kommandos effizient und einfach zur Verfügung zu stellen und zu verarbeiten. Mithilfe der Kommandos script, soda oder rest können auch Schnittstellen wie Javascript, Schemaless Application Development und ORDS 3.x Services bedient werden. Um einen Eindruck über die Möglichkeiten zu bekommen, schauen sie einfach einmal auf den Blog von Kris Rice. Um die Möglichkeiten aufzuzeigen, habe ich in der folgende Liste einige Blogeinträge ausgewählt.

Hinweis zur Lizenzierung

Das SQL Developer Linemode Utility kann wie auch SQL Developer kostenfrei von OTN geladen und verwendet werden. Keine zusätzliche Lizenzierung ist erforderlich.

Weitere Informationen

 

Zurück zum Anfang des Artikels

Zurück zur Community-Seite