javascript straight from the oracle database

93
Dimitri Gielis OMG! JavaScript Straight from the Oracle Database www.apexRnD.be dgielis.blogspot.com @dgielis [email protected]

Upload: dimitri-gielis

Post on 23-Jan-2018

201 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: JavaScript straight from the Oracle Database

Dimitri Gielis

OMG! JavaScript Straight from the Oracle Database

www.apexRnD.bedgielis.blogspot.com@[email protected]

Page 2: JavaScript straight from the Oracle Database

Dimitri Gielis❖ Founder & CEO of APEX R&D❖ 19+ years of Oracle

Experience (OCP & APEX Certified)

❖ Oracle ACE Director❖ “APEX Developer of the year

2009” by Oracle Magazine❖ “Oracle Developer Choice

award (ORDS)” in 2015❖ Author Expert Oracle APEX❖ Presenter at Conferences

Page 3: JavaScript straight from the Oracle Database

www.apexofficeprint.comwww.apexRnD.be

Page 4: JavaScript straight from the Oracle Database

http://dgielis.blogspot.com @dgielis

Page 5: JavaScript straight from the Oracle Database

Why?Why JavaScript in the DB?

Page 6: JavaScript straight from the Oracle Database
Page 7: JavaScript straight from the Oracle Database
Page 8: JavaScript straight from the Oracle Database

Occupational TherapyDemo

Page 9: JavaScript straight from the Oracle Database

Page 10: JavaScript straight from the Oracle Database

Benefits Running JavaScript in Oracle DB

❖ Achieving new database capabilities

❖ In-place and faster processing of JSON documents

❖ Reusing existing skills and code

Page 11: JavaScript straight from the Oracle Database

http://sogrady-media.redmonk.com/sogrady/files/2017/03/lang.rank_.117.wm_.png

Page 12: JavaScript straight from the Oracle Database

https://insights.stackoverflow.com/survey/2017#technology

Page 13: JavaScript straight from the Oracle Database
Page 14: JavaScript straight from the Oracle Database

Nashorn JavaScript Engine

Page 15: JavaScript straight from the Oracle Database
Page 16: JavaScript straight from the Oracle Database

with Nashorn

Page 17: JavaScript straight from the Oracle Database

A simple way to get started with Oracle Nashorn is to run JavaScript programs from the command line.

http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html

Page 18: JavaScript straight from the Oracle Database
Page 19: JavaScript straight from the Oracle Database

var hello = function() { print("Hello Nashorn!");};

hello();

Page 20: JavaScript straight from the Oracle Database

jjs hello.js

Page 21: JavaScript straight from the Oracle Database

Demo

Page 22: JavaScript straight from the Oracle Database

Nashorn in the Oracle Database

Page 23: JavaScript straight from the Oracle Database

Step 1Get the necessary privilege

Page 24: JavaScript straight from the Oracle Database

grant DBJAVASCRIPT to hr;

Page 25: JavaScript straight from the Oracle Database

Step 2Create your JavaScript function

Page 26: JavaScript straight from the Oracle Database

function hello(){ var h = "Hello Nashorn!"; return h;}

var output = hello();print(output);

Page 27: JavaScript straight from the Oracle Database

Step 3Upload your JS file to the Database

Page 28: JavaScript straight from the Oracle Database

loadjava -v -u hr hello.js

Page 29: JavaScript straight from the Oracle Database

Step 4Check JavaScript is in Database

Page 30: JavaScript straight from the Oracle Database

select object_name, object_type from user_objects where object_type = 'JAVA RESOURCE'

Page 31: JavaScript straight from the Oracle Database

Step 5Execute!

Page 32: JavaScript straight from the Oracle Database

begin dbms_javascript.run('hello.js'); end; /

Page 33: JavaScript straight from the Oracle Database

Demo

Page 34: JavaScript straight from the Oracle Database

Table Data

Page 35: JavaScript straight from the Oracle Database

Table

Page 36: JavaScript straight from the Oracle Database

JavaScript in DB way

Step 1: Privilege (done)Step 2: Create JavaScriptStep 3: Load into DBStep 4: Execute

Page 37: JavaScript straight from the Oracle Database

var selectQuery = function(pId) { var Driver = Packages.oracle.jdbc.OracleDriver; var oracleDriver = new Driver(); var url = "jdbc:default:connection:"; var connection = oracleDriver.defaultConnection();

// Prepare statement var query = "SELECT e.employee_id, e.first_name, e.last_name FROM employees e WHERE e.employee_id = ?”; var preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, pId); // execute Query var resultSet = preparedStatement.executeQuery();

// display results while (resultSet.next()) { var output = resultSet.getString("FIRST_NAME"); } // cleanup resultSet.close(); preparedStatement.close(); connection.close(); return output;

Page 38: JavaScript straight from the Oracle Database

var selectQuery = function(pId) { var Driver = Packages.oracle.jdbc.OracleDriver; var oracleDriver = new Driver(); var url = "jdbc:default:connection:"; var connection = oracleDriver.defaultConnection();

// Prepare statement var query = "SELECT e.employee_id, e.first_name, e.last_name FROM employees e WHERE e.employee_id = ?”; var preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, pId); // execute Query var resultSet = preparedStatement.executeQuery();

// display results while (resultSet.next()) { var output = resultSet.getString("FIRST_NAME"); } // cleanup resultSet.close(); preparedStatement.close(); connection.close(); return output;

Setup DB connection

Page 39: JavaScript straight from the Oracle Database

var selectQuery = function(pId) { var Driver = Packages.oracle.jdbc.OracleDriver; var oracleDriver = new Driver(); var url = "jdbc:default:connection:"; var connection = oracleDriver.defaultConnection();

// Prepare statement var query = "SELECT e.employee_id, e.first_name, e.last_name FROM employees e WHERE e.employee_id = ?”; var preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, pId); // execute Query var resultSet = preparedStatement.executeQuery();

// display results while (resultSet.next()) { var output = resultSet.getString("FIRST_NAME"); } // cleanup resultSet.close(); preparedStatement.close(); connection.close(); return output;

SQL Statement

Page 40: JavaScript straight from the Oracle Database

var selectQuery = function(pId) { var Driver = Packages.oracle.jdbc.OracleDriver; var oracleDriver = new Driver(); var url = "jdbc:default:connection:"; var connection = oracleDriver.defaultConnection();

// Prepare statement var query = "SELECT e.employee_id, e.first_name, e.last_name FROM employees e WHERE e.employee_id = ?”; var preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, pId); // execute Query var resultSet = preparedStatement.executeQuery();

// display results while (resultSet.next()) { var output = resultSet.getString("FIRST_NAME"); } // cleanup resultSet.close(); preparedStatement.close(); connection.close(); return output;

Execute

Page 41: JavaScript straight from the Oracle Database

var selectQuery = function(pId) { var Driver = Packages.oracle.jdbc.OracleDriver; var oracleDriver = new Driver(); var url = "jdbc:default:connection:"; var connection = oracleDriver.defaultConnection();

// Prepare statement var query = "SELECT e.employee_id, e.first_name, e.last_name FROM employees e WHERE e.employee_id = ?”; var preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, pId); // execute Query var resultSet = preparedStatement.executeQuery();

// display results while (resultSet.next()) { var output = resultSet.getString("FIRST_NAME"); } // cleanup resultSet.close(); preparedStatement.close(); connection.close(); return output;

Display Results

Page 42: JavaScript straight from the Oracle Database

var selectQuery = function(pId) { var Driver = Packages.oracle.jdbc.OracleDriver; var oracleDriver = new Driver(); var url = "jdbc:default:connection:"; var connection = oracleDriver.defaultConnection();

// Prepare statement var query = "SELECT e.employee_id, e.first_name, e.last_name FROM employees e WHERE e.employee_id = ?”; var preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, pId); // execute Query var resultSet = preparedStatement.executeQuery();

// display results while (resultSet.next()) { var output = resultSet.getString("FIRST_NAME"); } // cleanup resultSet.close(); preparedStatement.close(); connection.close(); return output;

Cleanup and Return

Page 43: JavaScript straight from the Oracle Database

loadjava -v -u hr query.js

Page 44: JavaScript straight from the Oracle Database

create or replace and compile java source named "InvokeScript" asimport javax.script.*;import java.net.*;import java.io.*;

public class InvokeScript { public static String eval(String inputId) throws Exception { String output = new String(); try { // create a script engine manager ScriptEngineManager factory = new ScriptEngineManager();

// create a JavaScript engine ScriptEngine engine = factory.getEngineByName("javascript");

//read the script as a java resource engine.eval(new InputStreamReader(InvokeScript.class.getResourceAsStream("query.js")));

Invocable invocable = (Invocable) engine; Object selectResult = invocable.invokeFunction("selectQuery", inputId); output = selectResult.toString(); } catch(Exception e) { output =e.getMessage(); } return output; }}/

Page 45: JavaScript straight from the Oracle Database

create or replace and compile java source named "InvokeScript" asimport javax.script.*;import java.net.*;import java.io.*;

public class InvokeScript { public static String eval(String inputId) throws Exception { String output = new String(); try { // create a script engine manager ScriptEngineManager factory = new ScriptEngineManager();

// create a JavaScript engine ScriptEngine engine = factory.getEngineByName("javascript");

//read the script as a java resource engine.eval(new InputStreamReader(InvokeScript.class.getResourceAsStream("query.js")));

Invocable invocable = (Invocable) engine; Object selectResult = invocable.invokeFunction("selectQuery", inputId); output = selectResult.toString(); } catch(Exception e) { output =e.getMessage(); } return output; }}/

Enable JavaScript engine

Page 46: JavaScript straight from the Oracle Database

create or replace and compile java source named "InvokeScript" asimport javax.script.*;import java.net.*;import java.io.*;

public class InvokeScript { public static String eval(String inputId) throws Exception { String output = new String(); try { // create a script engine manager ScriptEngineManager factory = new ScriptEngineManager();

// create a JavaScript engine ScriptEngine engine = factory.getEngineByName("javascript");

//read the script as a java resource engine.eval(new InputStreamReader(InvokeScript.class.getResourceAsStream("query.js")));

Invocable invocable = (Invocable) engine; Object selectResult = invocable.invokeFunction("selectQuery", inputId); output = selectResult.toString(); } catch(Exception e) { output =e.getMessage(); } return output; }}/

Tell which file

Page 47: JavaScript straight from the Oracle Database

create or replace and compile java source named "InvokeScript" asimport javax.script.*;import java.net.*;import java.io.*;

public class InvokeScript { public static String eval(String inputId) throws Exception { String output = new String(); try { // create a script engine manager ScriptEngineManager factory = new ScriptEngineManager();

// create a JavaScript engine ScriptEngine engine = factory.getEngineByName("javascript");

//read the script as a java resource engine.eval(new InputStreamReader(InvokeScript.class.getResourceAsStream("query.js")));

Invocable invocable = (Invocable) engine; Object selectResult = invocable.invokeFunction("selectQuery", inputId); output = selectResult.toString(); } catch(Exception e) { output =e.getMessage(); } return output; }}/

Call function with param

Page 48: JavaScript straight from the Oracle Database

CREATE OR REPLACE FUNCTION invokeScriptEval(inputId varchar2) return varchar2 as language java name 'InvokeScript.eval(java.lang.String) return java.lang.String';/

Page 49: JavaScript straight from the Oracle Database

SELECT invokeScriptEval(100) FROM dual;

Page 50: JavaScript straight from the Oracle Database

Demo

Page 51: JavaScript straight from the Oracle Database

Query JSON data

Page 52: JavaScript straight from the Oracle Database

Table

CREATE TABLE js_rest ( id NUMBER NOT NULL, json_clob CLOB, CONSTRAINT js_rest_pk PRIMARY KEY (id), CONSTRAINT js_rest_json_chk CHECK (json_clob IS JSON) );

Page 53: JavaScript straight from the Oracle Database

Data

INSERT INTO js_rest (id, json_clob) VALUES (1, '{ "id" : "1", "firstname" : "Dimitri", "lastname" : "Gielils", "company" : "APEX RnD", "email" : "[email protected]", "picture: : null, "address" : { "City" : "Leuven", "Country" : "Belgium" } }');

Page 54: JavaScript straight from the Oracle Database

Normal Database way

SELECT a.json_clob.id FROM js_rest a;

Page 55: JavaScript straight from the Oracle Database

Works? (>32k)

SELECT a.json_clob.picture FROM js_rest a;

Page 56: JavaScript straight from the Oracle Database

JavaScript in DB way

Step 1: Privilege (done)Step 2: Create JavaScriptStep 3: Load into DBStep 4: Execute

Page 57: JavaScript straight from the Oracle Database

var selectQuery = function(pId) { var Driver = Packages.oracle.jdbc.OracleDriver; var oracleDriver = new Driver(); var url = "jdbc:default:connection:"; var connection = oracleDriver.defaultConnection();

// Prepare statement var query = "SELECT a.json_clob FROM js_rest a WHERE a.id = ?”; var preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, pId); // execute Query var resultSet = preparedStatement.executeQuery();

// display results while (resultSet.next()) { var output = resultSet.getString(1); } // cleanup resultSet.close(); preparedStatement.close(); connection.close(); return output;}

Page 58: JavaScript straight from the Oracle Database

var selectQuery = function(pId) { var Driver = Packages.oracle.jdbc.OracleDriver; var oracleDriver = new Driver(); var url = "jdbc:default:connection:"; var connection = oracleDriver.defaultConnection();

// Prepare statement var query = "SELECT a.json_clob FROM js_rest a WHERE a.json_clob.id = ?”; var preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, pId); // execute Query var resultSet = preparedStatement.executeQuery();

// display results while (resultSet.next()) { var output = resultSet.getString(1); } // cleanup resultSet.close(); preparedStatement.close(); connection.close(); return output;}

Page 59: JavaScript straight from the Oracle Database

var selectQuery = function(pId) { // setup connection …

// Prepare statement var query = "SELECT a.json_clob FROM js_rest a WHERE a.id = ?”; var preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, pId); // execute Query var resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { var jsonClob = resultSet.getString(1); }

/* parse JSON */ var obj = JSON.parse(jsonClob); output = obj.picture;

// cleanup … return output;}

Page 60: JavaScript straight from the Oracle Database

loadjava -v -u hr query.js

Page 61: JavaScript straight from the Oracle Database

create or replace and resolve java source named "InvokeScript" as import javax.script.*; import oracle.sql.*; import oracle.jdbc.*; import java.sql.*; import java.net.*; import java.io.*;

public class InvokeScript { public static oracle.sql.CLOB eval(String inputId) throws Exception { String output = new String(); Connection con = DriverManager.getConnection("jdbc:default:connection:"); CLOB cl = CLOB.createTemporary(con, true, CLOB.DURATION_CALL);

try { ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("javascript"); engine.eval(new InputStreamReader(InvokeScript.class.getResourceAsStream("query.js"))); Invocable invocable = (Invocable) engine; Object selectResult = invocable.invokeFunction("selectQuery", inputId); output = selectResult.toString(); } catch(Exception e) { output = e.getMessage(); } cl.putString(1, output); return cl; } }

Page 62: JavaScript straight from the Oracle Database

CREATE OR REPLACE FUNCTION invokeScriptEval(inputId varchar2) return clob as language java name 'InvokeScript.eval(java.lang.String) return oracle.sql.CLOB';/

Page 63: JavaScript straight from the Oracle Database

SELECT invokeScriptEval(1) FROM dual;

Page 64: JavaScript straight from the Oracle Database

Demo

Page 65: JavaScript straight from the Oracle Database

SODASimple Oracle Document Access

Page 66: JavaScript straight from the Oracle Database

http://www.oracle.com/technetwork/database/application-development/oracle-document-store/index.html

Page 67: JavaScript straight from the Oracle Database

http://download.oracle.com/otndocs/products/database/SchemalessAppDevWithOracle12c/SchemalessAppDevWithOracle12c.html

Page 68: JavaScript straight from the Oracle Database
Page 69: JavaScript straight from the Oracle Database
Page 70: JavaScript straight from the Oracle Database
Page 71: JavaScript straight from the Oracle Database

Loading External Libraries

Page 72: JavaScript straight from the Oracle Database
Page 73: JavaScript straight from the Oracle Database

loadjava -v -u hr mustache.js

Page 74: JavaScript straight from the Oracle Database

create or replace and compile java source named "InvokeMustache" asimport javax.script.*;import java.net.*;import java.io.*;

public class InvokeMustache { public static String eval(String template, String data) throws Exception { String output = new String(); try { // create a script engine manager ScriptEngineManager factory = new ScriptEngineManager();

// create a JavaScript engine ScriptEngine engine = factory.getEngineByName("javascript");

//read the script as a java resource engine.eval(new InputStreamReader(InvokeMustache.class.getResourceAsStream("mustache.js")));

Invocable invocable = (Invocable) engine; Object selectResult = invocable.invokeFunction("callMustache", template, data); output = selectResult.toString(); } catch(Exception e) { output =e.getMessage(); } return output; }}/

Page 75: JavaScript straight from the Oracle Database

CREATE OR REPLACE FUNCTION doMustache(template varchar2, data varchar2) return varchar2 as language java name 'InvokeMustache.eval(java.lang.String) return java.lang.String';/

Page 76: JavaScript straight from the Oracle Database

SELECT doMustache(t, d) FROM mustache_template WHERE id = 1;

Page 77: JavaScript straight from the Oracle Database

http://momentjs.com

Page 78: JavaScript straight from the Oracle Database

http://underscorejs.org

Page 79: JavaScript straight from the Oracle Database

Demo

Page 80: JavaScript straight from the Oracle Database

More things to explore…

Page 81: JavaScript straight from the Oracle Database
Page 82: JavaScript straight from the Oracle Database
Page 83: JavaScript straight from the Oracle Database
Page 84: JavaScript straight from the Oracle Database
Page 85: JavaScript straight from the Oracle Database

“While Oracle Nashorn runs ECMA-compliant JavaScript, it is important to note that objects normally accessible in a web browser are not available, for

example, console, window, and so on.”

http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html

Page 86: JavaScript straight from the Oracle Database
Page 87: JavaScript straight from the Oracle Database

non-preemptive scheduling is not specific to OJVM but anything running in database session

Page 88: JavaScript straight from the Oracle Database

More investigation necessary

❖ CommonJS Modules❖ Polyfills for Nashorn (nashorn-polyfill.js)❖ Compile JavaScript to one file❖ WebJars

Page 89: JavaScript straight from the Oracle Database

https://github.com/nodyn/jvm-npm

https://github.com/coveo/nashorn-commonjs-modules

Page 90: JavaScript straight from the Oracle Database

Conclusion: JS in DB

❖ Interesting to follow and use when needed❖ Need a specific skill-set❖ Not that many “advanced” examples

Page 91: JavaScript straight from the Oracle Database

Resources

❖ Oracle Database 12.2 VM: http://www.oracle.com/technetwork/database/enterprise-edition/databaseappdev-vm-161299.html

❖ Doc: http://docs.oracle.com/database/122/JJDEV/GUID-9D7B5AF2-5F63-4484-968D-01EFB6A2D50F.htm#JJDEV-GUID-9D7B5AF2-5F63-4484-968D-01EFB6A2D50F

❖ API: https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/api.html

❖ Article: http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html

❖ Blog Post: http://www.n-k.de/riding-the-nashorn/#_loading_scripts

❖ Special thanks to: Carsten Czarski & Kuassi Mensah

Page 92: JavaScript straight from the Oracle Database

Q&A www.apexRnD.bedgielis.blogspot.com@[email protected]

Page 93: JavaScript straight from the Oracle Database

❖ Looking for consulting, training and development in Oracle Application Express (APEX)?

❖ Contact : www.apexRnD.be ❖ Mail : [email protected]

Consulting, Development, Training