dba:sqlcl_oracle_extend_commandregistry
Inhaltsverzeichnis
SQLcl flexibel nach Bedarf mit einem CommandoListener erweitern
Über das neue SQLcl siehe auch ⇒ SQLcl - Quo vadis SQL*Plus? - Das neue SQL*Plus in der Praxis - Der neue SQL Kommando Interpreter für die Oracle Datenbank und Jython Scripting für die Oracle Datenbank mit SQLcl
Aufgabe:
Über einen „Hint“ im SQL Befehl soll gesteuert werden, ob die Ausführungszeit für das Statement am Ende ausgeben wird.
Command Ausführung in SQLcl steuern
Wir definieren einen Event Handler, der vor und nach jeden abgesetzten Kommando in SQLcl aktiv wird.
Es gibt zwei Typen von Event Listener
- Wird bei diesem Command gerufen: CommandRegistry.addListener(<class>,<command>)
- Wird bei jeden Command gerufen : CommandRegistry.addForAllStmtsListener(<class>)
Code
<// Refernz to the SQLcl Command Registry Class var CommandRegistry = Java.type("oracle.dbtools.raptor.newscriptrunner.CommandRegistry"); // CommandListener for creating new any command Listener var CommandListener = Java.type("oracle.dbtools.raptor.newscriptrunner.CommandListener") // Java Script object to hold the new methodes var extCommand = {}; // Called to attempt to handle any command extCommand.handleEvent = function (conn,ctx,sqlcl) { // return FALSE to indicate the command was not handled // now other commandListeners can handle this command return false; } // fired before ANY command extCommand.beginEvent = function (conn,ctx,sqlcl) { // Get the actual command if ( sqlcl.getSql().indexOf("showTime") > 0 ){ ctx.putProperty("gpi.showTiming",true); ctx.write("\n -- Debug sqlcl: " + sqlcl.getSql()+ " Set timing on true \n"); //remember the time ctx.putProperty("gpi.startTiming",new Date()); } } // fired after ANY Command extCommand.endEvent = function (conn,ctx,sqlcl) { if ( ctx.getProperty("gpi.showTiming") ) { var end = new Date().getTime(); var start = ctx.getProperty("gpi.startTiming"); start = start.getTime(); // print out elapsed time of all commands ctx.write("Command elapsed time :: " + (end - start) + " ms \n"); //unset ctx.putProperty("gpi.showTiming",false); } } // Actual Extend of the Java CommandListener var ShowTimingCmd = Java.extend(CommandListener, { handleEvent: extCommand.handleEvent , beginEvent: extCommand.beginEvent , endEvent: extCommand.endEvent }); // Registering the new Command CommandRegistry.addForAllStmtsListener(ShowTimingCmd.class);
Quellen
Beispiel Source Code von Kris Rice
dba/sqlcl_oracle_extend_commandregistry.txt · Zuletzt geändert: 2016/11/15 19:58 von gpipperr