Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:sqlcl_oracle_command_line_in_12c

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 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

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.

  1. Download der Jar Datei jython-standalone-2.7.0.jar von http://www.jython.org/downloads.html
  2. Kopieren nach $SQLCL_HOME/lib
  3. Einbinden in den Klassen Pfad, über die Umgebung oder über die $SQLCL_HOME/bin/sql.bat bzw. sql
    1. Linux: export CLASSPATH=$CLASSPATH:/opt/oracle/products/sqlcl/lib/jython-standalone-2.7.0.jar
  4. Erstellen des ersten Jython scripts helloWorld.py
    print "Hello World" 
  5. 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!

Quellen

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
dba/sqlcl_oracle_command_line_in_12c.txt · Zuletzt geändert: 2018/03/12 20:40 von Gunther Pippèrr