Inhaltsverzeichnis
SQLcl - Quo vadis SQL*Plus? - Das neue SQL*Plus in der Praxis - Der neue SQL Kommando Interpreter für die Oracle Datenbank
Ist es nun so weit? Gehört nun auch SQL*Plus bald der Geschichte an?
Welche Feature erwarten uns und ist das wirklich ein echter Ersatz für SQL*Plus?
Vortrag als PDF Datei ⇒ siehe https://www.pipperr.de/knowhow/sqlcl/oracle_sqlcl.html
Übersicht
SQLcl ist in Java implementiert und ist auch Teil des SQL Developers.
Über http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html bzw. http://www.oracle.com/technetwork/developer-tools/sqlcl/downloads/index.html kann ganz unten auf der Webseite die Command Line - SQLcl - Release geladen werden, aktuell in der Version vom Nov 3, 2016.
Ziel des SQLcl Projektes ist es neben der Kompatibilität zu SQL*Plus auch eine Reihe von neuen Features anzubieten
Lizenzbedingungen
Soll SQLcl als Teil einer eigenen Software Lösung an den Endkunden verteilt werden, zum Beispiel als Teil der einer Installationsroutine, ist das NICHT erlaubt, der Endkunden muss sich das Tool dann separat herunterladen.
Siehe Folgende Frage über das Forum : https://community.oracle.com/thread/3988300
Siehe hier die Lizenz Bedingungen : ⇒ http://www.oracle.com/technetwork/licenses/sqldev-license-152021.html
Installation
Eine eigentliche Installation ist nicht notwendig, es reicht die Zip Datei nach dem Download in ein Verzeichnis zu entpacken. Eine Java 8 Installation wird allerdings zwingend vorausgesetzt.
Nach dem Entpacken die „sql.bat“ unter Windows bzw “sql“ unter Linux starten und hoffen, dass es klappt, treten Java Fehler auf, die Dateien anpassen, die Skripte sind nicht sonderlich robust umgesetzt.
Java Registry Fehler mit der Version SQLcl: Release 4.2.0
Fehler: WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs
PS C:\oracle\products\sqlcl\bin> .\sql.bat /nolog Nov 04, 2016 12:43:56 PM java.util.prefs.WindowsPreferences <init> WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) r eturned error code 5. SQLcl: Release 4.2.0 Production on Fri Nov 04 12:43:57 2016
Diesen Key mit „regedit“ anlegen:
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs
Telefonat nach Hause
Beim Aufruf von SQLcl fragt die Software unter „https://apex.oracle.com/pls/apex/dbtools/usage/sqlcl.json“ nach einer neuen Version und kann wohl auch dann ein Werbebanner darstellen.
Mehrsprachigkeit
Hier zum Beispiel in auf einem englischen Windows 10 in der Powershell:
# SET ALL TO German set-item -path ENV:JAVA_TOOL_OPTIONS -VALUE "-Duser.language=de -Duser.region=DE -Duser.country=DE" set-item -path ENV:NLS_LANG -VALUE "german_germany.utf8" .\SQL.exe / AS sysdba Picked up JAVA_TOOL_OPTIONS: -Duser.language=de -Duser.region=DEPicked up JAVA_TOOL_OPTIONS: -Duser.language=de -Duser.region=DE -Duser.country=DE -Duser.variant=Traditional_WIN .. Verbunden mit: .. SYS@GPI-saturn>SELECT * FROM not_exit_table; Fehler bei Befehlszeile: 1 Spalte: 15 Fehlerbericht - SQL-Fehler: ORA-00942: Tabelle oder VIEW nicht vorhanden 00942. 00000 - "table or view does not exist" -- check the settings: SYS@GPI-saturn>script var System = Java.type("java.lang.System"); var Locale = Java.type("java.util.Locale") System.out.println( System.getProperty("user.language")); System.out.println( System.getProperty("user.country")); System.out.println(Locale.getDefault()); / de DE de_DE SYS@GPI-saturn>exit Abgemeldet von Oracle DATABASE 12c ...
Siehe auch SQLcl 4.2 - Set the language of the help text ⇒ https://community.oracle.com/thread/3925837
Erste Schritte
Die meisten Oracle SQL*Plus Format Befehlt wurde implementiert, leider aber nicht 100% aller Anweisungen.
Das ist zum Teil etwas lästig, da ältere SQL*Plus Script nicht 1zu1 in beiden Umgebungen lauffähig sind.
Hier ist es angeraten über das Forum https://community.oracle.com/community/database/developer-tools/sql_developer/sqlcl mit der Entwicklung Kontakt aufzunehmen und nachzufragen, evtl. wird doch noch das eine oder andere Feature implementiert.
Neue Funktionen gegenüber SQL*Plus
Das wohl interessante Feature ist der Befehlszeilen Buffer unter Linux, das haben wohl schon Generation von DBA’s vermisst .-) .
Unter Linux liegt die History unter ~/.sqlcl/history.xml, hier liegt auch in der Datei aliases.xml die Alias Definition. Unter Windows kann die Datei unter „C:\Users\<user>\AppData\Roaming\sqlcl“ gefunden werden.
Allerdings sind, wie früher die „login.sql“, auch diese Dateien nicht wirklich geschützt. Hier ergeben sich wieder gute Angriffsvektoren um Kollegen ungewollten Code „unterzuschieben“. Hier hätte Oracle etwas sorgsamer arbeiten können, Oracle lernen das anscheinend nie an so etwas zu denken.
Einen Alias definieren
Einen Shortcut zu häufigen Aufrufen von SQL Statments und Scripten definieren
-- define the alias alias ls=SELECT object_name FROM user_objects --call ls ...
Oracle Fehlernummern auflösen
oerr ora 600 .. *Cause: This IS the generic internal error NUMBER FOR Oracle program ...
Mit SQL „hints“ verschiedene Ausgabenformate definieren
Entweder mit SET SQLFORMAT { csv,html,xml,json,ansiconsole,insert,loader,fixed,default} oder als Hint die Ausgabe eines SQL Statements direkt in dem jeweiligen Format speichern.
Beispiel:
SELECT /*csv*/ * FROM employees; -- Comma-separated values SELECT /*delimited*/ * FROM employees; -- (same as csv) SELECT /*fixed*/ * FROM employees; -- Fixed-width fields with trailing blanks SELECT /*html*/ * FROM employees; -- Marked-up HTML table SELECT /*insert*/ * FROM employees; -- SQL INSERT statements SELECT /*loader*/ * FROM employees; -- Pipe-delimited format suitable for SQL*Loader SELECT /*text*/ * FROM employees; -- Plain text SELECT /*xml*/ * FROM employees; -- Tagged XML
Praktisch
DDL erstellen
Mit „ddl obect_name“ das Create Statemente eines DB Objektes anzeigen.
SQL> ddl dept CREATE TABLE "SCOTT"."DEPT" ( "DEPTNO" NUMBER(2,0), "DNAME" VARCHAR2(14), "LOC" VARCHAR2(13), .... BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "USERS" ;
Network Alias in SQLcl erstellen
Zuvor mit „set net on“ aktiveren!
Beispiel:
SQL>net 10.10.10.1:1521/gpi -- auf ; am ende achten! SQL>net alias local_db=10.10.10.1:1521/gpi; -- Feature einschalten! SQL>SET net ON SQL>conn scott@local_db -- Verbindung wird nun über diese Alias aufgebaut!
F11 Fullscreen - CRTL-L löscht den Screen
Mit der F 11 Taste kann in einen Fullscreen Modus geschaltetet werden.
Mit CTRL+L kann der Screen gelöscht werden.
LOAD
Mit dem load Befehlt CSV laden
siehe ⇒ http://dbdude.net/oracle-sqlcl-use-sqlcl-to-simply-export-via-set-sqlformat-csv-and-import-via-load/
Kompatibilität mit SQL*Plus
Leider ist die Kompatibilität zu SQL*Plus etwas eingeschränkt, hier hätte ich mehr erwartet, zumal das teilweise nur Kleinigkeiten sind.
Viel besser wäre es meiner Meinung nach gewesen alles 1zu1 nach zubauen um den guten Eindruck nicht zu trüben.
Vermisse zum Beispiel die folgenden Features:
- DOCUMENT tag
- set underline
- set markup html
Auch ist mit den vielen möglichen Format Optionen von SQL*Plus auf Spalten noch nicht alles umgesetzt bzw. funktioniert nicht so ganz wie erwartet.
„set Repscan“ ist nicht implementiert, auf das kann ich wiederum persönlich verzichten, ist nur ärgerlich wenn das dann einen Fehler im Script wirft.
Siehe dazu auch die Nachfrage https://community.oracle.com/thread/3925290?sr=stream&ru=315836
Mit den aktuellen Release von Mai 2015 ist es schon etwas besser geworden, aber nach einer Stunde Suchen konnte ich wieder eine ganze Menge an Nachfragen an Oracle senden .-(, schade, aber evtl. wird es ja noch besser.
Prüfen in welchen Tool man ist
Default define anschauen:
--SQL*Plus SQL> define _SQLPLUS_RELEASE DEFINE _SQLPLUS_RELEASE = "1201000200" (CHAR) --SQLcl SQL> define _SQLPLUS_RELEASE DEFINE _SQLPLUS_RELEASE = "040200162601205" (CHAR) -- abfragen mit SET verify off COLUMN SQLPLUS_VERSION format a20 SELECT decode(substr('&&_SQLPLUS_RELEASE',0,1), '0','SQLCL','SQLPLUS') AS SQLPLUS_VERSION FROM dual; SET verify ON
Gefällt mir nicht so recht, ab der version 10 von SQLcl wird es nicht mehr funktionieren….
Scripting mit SQLcl
Das interessanteste und wichtigste Feature ist das Scripting mit SQLcl. Leider ist aber das Ganze noch nicht so wirklich dokumentiert. Einige Beispiele finden sich hier ⇒ https://github.com/oracle/oracle-db-tools/tree/master/sqlcl Folgende Objekte können in Script (default Java Script Syntax) direkt angesprochen werden:
- sqlcl - SQLCL selbst wie sqlcl.setStmt(„select * from dual“) und sqlcl.run() um das dann auszuführen
- ctx - Object vom Typ ScriptContext, kann direkt angesprochen werden - wie ctx.write(„String“)
- util - wie var user=util.executeReturnOneCol('select user from dual');
Hier das erste Hello World Beispiel:
script ctx.write("Hello Word\n"); /
Soll aber auf bestimte Java Klassen zugeriffen werden müssen diese zuvor eingebunden werden wie zum Beispiel ⇒ „var System = Java.type(„java.lang.System“);“
Beispiel - SQLcl Oberflächen Sprache per Script in der login.sql setzen:
script var System = Java.type("java.lang.System"); System.setProperty("user.lang","en"); System.setProperty("user.country","us"); System.out.println( System.getProperty("user.lang")); System.out.println( System.getProperty("user.country")); /
Formatangaben anpassen über die FormatRegistry:
script var FormatRegistry = Java.type("oracle.dbtools.raptor.format.FormatRegistry"); FormatRegistry.setLineTerminator("-\t"); ctx.write("getLineTerminator ::" + FormatRegistry.getLineTerminator()+"\n"); /
Weitere Script Sprachen einbinden
Es können auch verschiedene Script Sprachen eingesetzt werden, je nach persönlichen Wunsch.
Möglich wird das durch die Implementierung des Java Scripting Interfaces JSR-223.
Siehe auch:
Python einbinden
Java ⇒ http://www.jython.org/
Um zum Beispiel Jython einzubinden muss nur die Jar Datei in den Klassenpfad beim Aufruf von SQLcl aufgenommen werden.
- Download der Jar Datei jython-standalone-2.7.0.jar von http://www.jython.org/downloads.html
- Kopieren nach $SQLCL_HOME/lib
- Einbinden in den Klassen Pfad, über die Umgebung oder über die $SQLCL_HOME/bin/sql.bat bzw. sql
- Linux: export CLASSPATH=$CLASSPATH:/opt/oracle/products/sqlcl/lib/jython-standalone-2.7.0.jar
- Erstellen des ersten Jython scripts helloWorld.py
print "Hello World"
- Aufruf mit „SQL> script helloWorld.py“ ⇒ „Hello World“
D.h. die ScriptEngine erkennt über die Datei Endung, was für ein Interpreter verwandt werden soll!
Problem: console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp65001.
Leider führt der erste Test unter Windows gleich zu einem „console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp65001.“
Das lässt sich zwar über den Java Start Parameter „-Dpython.console.encoding=UTF-8“ bekämpfen, zeigt aber wieder auf, dass hier noch viel Arbeit für Oracle notwendig ist um das Konsolenwerkzeug unter Windows wirklich lauffähig zu bekommen.
Mehr Beispiele ⇒ Jython Scripting für die Oracle Datenbank mit SQLcl
LUA in SQLcl verwenden
Zu Lua sieh:
Lua Java Interpreter „luaj-jse-3.0.1.jar“ in den Klassenpfad beim Aufruf von SQLcl einbinden:
%JAVA_HOME%\bin\java.exe -cp "%CPFILE%";C:\work\luaj-3.0.1\lib\luaj-jse-3.0.1.jar ........
Das Einfachste LUA Script:
io.write("Hello world, from ",_VERSION,"!\n")
Aufruf in SQLcl:
SQL> script HelloWorld.lua Hello world, FROM Luaj-jse 3.0.1!