=====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 [[dba:variablen_sqlplus| 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 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\\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 8-) ===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 [[https://jcp.org/aboutJava/communityprocess/final/jsr223/index.html|JSR-223]]. Siehe auch: * https://docs.oracle.com/javase/8/docs/api/javax/script/package-tree.html * http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html * https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/ * https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/ ===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.pyprint "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 => [[python:jython_scripting_database|Jython Scripting für die Oracle Datenbank mit SQLcl]] ===LUA in SQLcl verwenden=== Zu Lua sieh: * http://www.luaj.org/luaj/3.0/README.html * https://www.lua.org/manual/5.3/ 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! ---- ==== Quellen ==== Forum: * https://community.oracle.com/community/database/developer-tools/sql_developer/sqlcl Beispiele: * http://www.thatjeffsmith.com/archive/2015/02/oracle-sqlcl-slidedeck-overview-of-our-new-command-line-interface/ * https://mikesmithers.wordpress.com/2015/04/12/sqlcl-the-new-sqlplus/