SlideShare a Scribd company logo
1 of 93
Download to read offline
Dimitri Gielis
OMG! JavaScript
Straight from the
Oracle Database
www.apexRnD.be
dgielis.blogspot.com
@dgielis
dgielis@apexRnD.be
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
www.apexofficeprint.comwww.apexRnD.be
http://dgielis.blogspot.com @dgielis
Why?Why JavaScript in the DB?
Occupational Therapy
Demo
…
…
Benefits Running JavaScript in Oracle DB
❖ Achieving new database capabilities
❖ In-place and faster processing of JSON documents
❖ Reusing existing skills and code
http://sogrady-media.redmonk.com/sogrady/files/2017/03/lang.rank_.117.wm_.p
https://insights.stackoverflow.com/survey/2017#technology
Nashorn JavaScript Engine
with Nashorn
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
var hello = function() {
print("Hello Nashorn!");
};
hello();
jjs hello.js
Demo
Nashorn in the Oracle Database
Step 1
Get the necessary privilege
grant DBJAVASCRIPT to hr;
Step 2
Create your JavaScript function
function hello(){
var h = "Hello Nashorn!";
return h;
}
var output = hello();
print(output);
Step 3
Upload your JS file to the Database
loadjava -v -u hr hello.js
Step 4
Check JavaScript is in Database
select object_name, object_type
from user_objects
where object_type = 'JAVA RESOURCE'
Step 5
Execute!
begin
dbms_javascript.run('hello.js');
end;
/
Demo
Table Data
Table
JavaScript in DB way
Step 1: Privilege (done)
Step 2: Create JavaScript
Step 3: Load into DB
Step 4: Execute
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;
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
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
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
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
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
loadjava -v -u hr query.js
create or replace and compile java source named "InvokeScript" as
import 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;
}
}
create or replace and compile java source named "InvokeScript" as
import 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
create or replace and compile java source named "InvokeScript" as
import 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
create or replace and compile java source named "InvokeScript" as
import 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
CREATE OR REPLACE FUNCTION invokeScriptEval(inputId varchar2)
return varchar2 as language java
name 'InvokeScript.eval(java.lang.String)
return java.lang.String';
/
SELECT invokeScriptEval(100)
FROM dual;
Demo
Query JSON data
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)
);
Data
INSERT INTO js_rest (id, json_clob)
VALUES (1,
'{
"id" : "1",
"firstname" : "Dimitri",
"lastname" : "Gielils",
"company" : "APEX RnD",
"email" : "dgielis@apexrnd.be",
"picture: : null,
"address" : {
"City" : "Leuven",
"Country" : "Belgium"
}
}');
Normal Database way
SELECT a.json_clob.id
FROM js_rest a;
Works? (>32k)
SELECT a.json_clob.picture
FROM js_rest a;
JavaScript in DB way
Step 1: Privilege (done)
Step 2: Create JavaScript
Step 3: Load into DB
Step 4: Execute
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;
}
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;
}
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;
}
loadjava -v -u hr query.js
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;
}
}
CREATE OR REPLACE FUNCTION invokeScriptEval(inputId varchar2)
return clob as language java
name 'InvokeScript.eval(java.lang.String)
return oracle.sql.CLOB';
/
SELECT invokeScriptEval(1)
FROM dual;
Demo
SODA
Simple Oracle Document Access
http://www.oracle.com/technetwork/database/application-development/oracle-document-store/index.html
http://download.oracle.com/otndocs/products/database/SchemalessAppDevWithOracle12c/SchemalessAppDevWithOracle12c.html
Loading External Libraries
loadjava -v -u hr mustache.js
create or replace and compile java source named "InvokeMustache" as
import 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;
}
}
CREATE OR REPLACE FUNCTION doMustache(template varchar2,
data varchar2)
return varchar2 as language java
name 'InvokeMustache.eval(java.lang.String)
return java.lang.String';
/
SELECT doMustache(t, d)
FROM mustache_template
WHERE id = 1;
http://momentjs.com
http://underscorejs.org
Demo
More things to explore…
“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
non-preemptive scheduling is not specific to OJVM but anything running in database session
More investigation necessary
❖ CommonJS Modules
❖ Polyfills for Nashorn (nashorn-polyfill.js)
❖ Compile JavaScript to one file
❖ WebJars
https://github.com/nodyn/jvm-npm
https://github.com/coveo/nashorn-commonjs-modules
Conclusion: JS in DB
❖ Interesting to follow and use when needed
❖ Need a specific skill-set
❖ Not that many “advanced” examples
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
Q&A
www.apexRnD.be
dgielis.blogspot.com
@dgielis
dgielis@apexRnD.be
❖ Looking for consulting, training and development in
Oracle Application Express (APEX)?
❖ Contact : www.apexRnD.be
❖ Mail : info@apexRnD.be
Consulting, Development, Training

More Related Content

What's hot

2 ways to get total sum of interactive grid column oracle apex ontoor blogs
2 ways to get total sum of interactive grid column oracle apex   ontoor blogs2 ways to get total sum of interactive grid column oracle apex   ontoor blogs
2 ways to get total sum of interactive grid column oracle apex ontoor blogs
sulimankareem
 
Clean Code II - Dependency Injection
Clean Code II - Dependency InjectionClean Code II - Dependency Injection
Clean Code II - Dependency Injection
Theo Jungeblut
 
PL/SQL Code for Sample Projects
PL/SQL Code for Sample ProjectsPL/SQL Code for Sample Projects
PL/SQL Code for Sample Projects
jwjablonski
 

What's hot (20)

Oracle Forms to APEX conversion tool
Oracle Forms to APEX conversion toolOracle Forms to APEX conversion tool
Oracle Forms to APEX conversion tool
 
2 ways to get total sum of interactive grid column oracle apex ontoor blogs
2 ways to get total sum of interactive grid column oracle apex   ontoor blogs2 ways to get total sum of interactive grid column oracle apex   ontoor blogs
2 ways to get total sum of interactive grid column oracle apex ontoor blogs
 
PostgreSQL Tutorial For Beginners | Edureka
PostgreSQL Tutorial For Beginners | EdurekaPostgreSQL Tutorial For Beginners | Edureka
PostgreSQL Tutorial For Beginners | Edureka
 
Owl: The New Odoo UI Framework
Owl: The New Odoo UI FrameworkOwl: The New Odoo UI Framework
Owl: The New Odoo UI Framework
 
Angular 10 course_content
Angular 10 course_contentAngular 10 course_content
Angular 10 course_content
 
React + Redux Introduction
React + Redux IntroductionReact + Redux Introduction
React + Redux Introduction
 
Build web apps with react js
Build web apps with react jsBuild web apps with react js
Build web apps with react js
 
Understanding react hooks
Understanding react hooksUnderstanding react hooks
Understanding react hooks
 
ReactJS presentation
ReactJS presentationReactJS presentation
ReactJS presentation
 
.Net Core
.Net Core.Net Core
.Net Core
 
React Hooks
React HooksReact Hooks
React Hooks
 
Extensible Data Modeling
Extensible Data ModelingExtensible Data Modeling
Extensible Data Modeling
 
1. Arrow Functions | JavaScript | ES6
1. Arrow Functions | JavaScript | ES61. Arrow Functions | JavaScript | ES6
1. Arrow Functions | JavaScript | ES6
 
9. ES6 | Let And Const | TypeScript | JavaScript
9. ES6 | Let And Const | TypeScript | JavaScript9. ES6 | Let And Const | TypeScript | JavaScript
9. ES6 | Let And Const | TypeScript | JavaScript
 
Its time to React.js
Its time to React.jsIts time to React.js
Its time to React.js
 
Introduction to .NET Core
Introduction to .NET CoreIntroduction to .NET Core
Introduction to .NET Core
 
Clean Code II - Dependency Injection
Clean Code II - Dependency InjectionClean Code II - Dependency Injection
Clean Code II - Dependency Injection
 
Angular - Chapter 5 - Directives
 Angular - Chapter 5 - Directives Angular - Chapter 5 - Directives
Angular - Chapter 5 - Directives
 
PL/SQL Code for Sample Projects
PL/SQL Code for Sample ProjectsPL/SQL Code for Sample Projects
PL/SQL Code for Sample Projects
 
Introduction to ReactJS
Introduction to ReactJSIntroduction to ReactJS
Introduction to ReactJS
 

Similar to JavaScript straight from the Oracle Database

A Discussion on Automatic Programming
A Discussion on Automatic ProgrammingA Discussion on Automatic Programming
A Discussion on Automatic Programming
techmonkey4u
 
Distributed Objects: CORBA/Java RMI
Distributed Objects: CORBA/Java RMIDistributed Objects: CORBA/Java RMI
Distributed Objects: CORBA/Java RMI
elliando dias
 

Similar to JavaScript straight from the Oracle Database (20)

Java script for web developer
Java script for web developerJava script for web developer
Java script for web developer
 
How to execute an oracle stored procedure with nested table as a parameter fr...
How to execute an oracle stored procedure with nested table as a parameter fr...How to execute an oracle stored procedure with nested table as a parameter fr...
How to execute an oracle stored procedure with nested table as a parameter fr...
 
Scrollable Test App
Scrollable Test AppScrollable Test App
Scrollable Test App
 
Ojdbc
OjdbcOjdbc
Ojdbc
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
 
Future of Web Apps: Google Gears
Future of Web Apps: Google GearsFuture of Web Apps: Google Gears
Future of Web Apps: Google Gears
 
Spring data iii
Spring data iiiSpring data iii
Spring data iii
 
Writing testable js [by Ted Piotrowski]
Writing testable js [by Ted Piotrowski]Writing testable js [by Ted Piotrowski]
Writing testable js [by Ted Piotrowski]
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
My java file
My java fileMy java file
My java file
 
jdbc
jdbcjdbc
jdbc
 
JavaScript Core
JavaScript CoreJavaScript Core
JavaScript Core
 
#18.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#18.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#18.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#18.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
SPARQLing cocktails
SPARQLing cocktailsSPARQLing cocktails
SPARQLing cocktails
 
Jdbc
JdbcJdbc
Jdbc
 
A Discussion on Automatic Programming
A Discussion on Automatic ProgrammingA Discussion on Automatic Programming
A Discussion on Automatic Programming
 
Distributed Objects: CORBA/Java RMI
Distributed Objects: CORBA/Java RMIDistributed Objects: CORBA/Java RMI
Distributed Objects: CORBA/Java RMI
 
NoSQL and JavaScript: a Love Story
NoSQL and JavaScript: a Love StoryNoSQL and JavaScript: a Love Story
NoSQL and JavaScript: a Love Story
 
Jdbc
JdbcJdbc
Jdbc
 
Asynchronous Interfaces
Asynchronous InterfacesAsynchronous Interfaces
Asynchronous Interfaces
 

More from Dimitri Gielis

More from Dimitri Gielis (18)

Bring the light in your Always FREE Oracle Cloud
Bring the light in your Always FREE Oracle CloudBring the light in your Always FREE Oracle Cloud
Bring the light in your Always FREE Oracle Cloud
 
APEX Office Print (AOP)
APEX Office Print (AOP)APEX Office Print (AOP)
APEX Office Print (AOP)
 
REST Web Service? No, GraphQL please!
REST Web Service? No, GraphQL please!REST Web Service? No, GraphQL please!
REST Web Service? No, GraphQL please!
 
Bringing Virtual Reality (VR) and Augmented Reality (AR) to APEX
Bringing Virtual Reality (VR) and Augmented Reality (AR) to APEXBringing Virtual Reality (VR) and Augmented Reality (AR) to APEX
Bringing Virtual Reality (VR) and Augmented Reality (AR) to APEX
 
Oracle APEX Cheat Sheet
Oracle APEX Cheat SheetOracle APEX Cheat Sheet
Oracle APEX Cheat Sheet
 
Reporting with Oracle Application Express (APEX)
Reporting with Oracle Application Express (APEX)Reporting with Oracle Application Express (APEX)
Reporting with Oracle Application Express (APEX)
 
Moving your APEX app to the Oracle Exadata Express Cloud
Moving your APEX app to the Oracle Exadata Express CloudMoving your APEX app to the Oracle Exadata Express Cloud
Moving your APEX app to the Oracle Exadata Express Cloud
 
Oracle APEX for Beginners
Oracle APEX for BeginnersOracle APEX for Beginners
Oracle APEX for Beginners
 
Service Workers and APEX
Service Workers and APEXService Workers and APEX
Service Workers and APEX
 
APEX Office Print
APEX Office PrintAPEX Office Print
APEX Office Print
 
Real Application Security (RAS) and Oracle Application Express (APEX)
Real Application Security (RAS) and Oracle Application Express (APEX)Real Application Security (RAS) and Oracle Application Express (APEX)
Real Application Security (RAS) and Oracle Application Express (APEX)
 
Moving to the APEX Listener
Moving to the APEX ListenerMoving to the APEX Listener
Moving to the APEX Listener
 
APEX Wearables
APEX WearablesAPEX Wearables
APEX Wearables
 
APEX Security 101
APEX Security 101APEX Security 101
APEX Security 101
 
APEX 5 Demo and Best Practices
APEX 5 Demo and Best PracticesAPEX 5 Demo and Best Practices
APEX 5 Demo and Best Practices
 
A Primer on Web Components in APEX
A Primer on Web Components in APEXA Primer on Web Components in APEX
A Primer on Web Components in APEX
 
How to make APEX print through Node.js
How to make APEX print through Node.jsHow to make APEX print through Node.js
How to make APEX print through Node.js
 
Oracle Application Express (APEX) and Microsoft Sharepoint integration
Oracle Application Express (APEX) and Microsoft Sharepoint integrationOracle Application Express (APEX) and Microsoft Sharepoint integration
Oracle Application Express (APEX) and Microsoft Sharepoint integration
 

Recently uploaded

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 

Recently uploaded (20)

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 

JavaScript straight from the Oracle Database

  • 1. Dimitri Gielis OMG! JavaScript Straight from the Oracle Database www.apexRnD.be dgielis.blogspot.com @dgielis dgielis@apexRnD.be
  • 2. 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
  • 6.
  • 7.
  • 10. Benefits Running JavaScript in Oracle DB ❖ Achieving new database capabilities ❖ In-place and faster processing of JSON documents ❖ Reusing existing skills and code
  • 13.
  • 15.
  • 17. 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
  • 18.
  • 19. var hello = function() { print("Hello Nashorn!"); }; hello();
  • 21. Demo
  • 22. Nashorn in the Oracle Database
  • 23. Step 1 Get the necessary privilege
  • 25. Step 2 Create your JavaScript function
  • 26. function hello(){ var h = "Hello Nashorn!"; return h; } var output = hello(); print(output);
  • 27. Step 3 Upload your JS file to the Database
  • 28. loadjava -v -u hr hello.js
  • 29. Step 4 Check JavaScript is in Database
  • 30. select object_name, object_type from user_objects where object_type = 'JAVA RESOURCE'
  • 33. Demo
  • 35. Table
  • 36. JavaScript in DB way Step 1: Privilege (done) Step 2: Create JavaScript Step 3: Load into DB Step 4: Execute
  • 37. 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;
  • 38. 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
  • 39. 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
  • 40. 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
  • 41. 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
  • 42. 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
  • 43. loadjava -v -u hr query.js
  • 44. create or replace and compile java source named "InvokeScript" as import 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; } }
  • 45. create or replace and compile java source named "InvokeScript" as import 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
  • 46. create or replace and compile java source named "InvokeScript" as import 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
  • 47. create or replace and compile java source named "InvokeScript" as import 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
  • 48. CREATE OR REPLACE FUNCTION invokeScriptEval(inputId varchar2) return varchar2 as language java name 'InvokeScript.eval(java.lang.String) return java.lang.String'; /
  • 50. Demo
  • 52. 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) );
  • 53. Data INSERT INTO js_rest (id, json_clob) VALUES (1, '{ "id" : "1", "firstname" : "Dimitri", "lastname" : "Gielils", "company" : "APEX RnD", "email" : "dgielis@apexrnd.be", "picture: : null, "address" : { "City" : "Leuven", "Country" : "Belgium" } }');
  • 54. Normal Database way SELECT a.json_clob.id FROM js_rest a;
  • 56. JavaScript in DB way Step 1: Privilege (done) Step 2: Create JavaScript Step 3: Load into DB Step 4: Execute
  • 57. 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; }
  • 58. 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; }
  • 59. 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; }
  • 60. loadjava -v -u hr query.js
  • 61. 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; } }
  • 62. CREATE OR REPLACE FUNCTION invokeScriptEval(inputId varchar2) return clob as language java name 'InvokeScript.eval(java.lang.String) return oracle.sql.CLOB'; /
  • 64. Demo
  • 68.
  • 69.
  • 70.
  • 72.
  • 73. loadjava -v -u hr mustache.js
  • 74. create or replace and compile java source named "InvokeMustache" as import 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; } }
  • 75. CREATE OR REPLACE FUNCTION doMustache(template varchar2, data varchar2) return varchar2 as language java name 'InvokeMustache.eval(java.lang.String) return java.lang.String'; /
  • 76. SELECT doMustache(t, d) FROM mustache_template WHERE id = 1;
  • 79. Demo
  • 80. More things to explore…
  • 81.
  • 82.
  • 83.
  • 84.
  • 85. “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
  • 86.
  • 87. non-preemptive scheduling is not specific to OJVM but anything running in database session
  • 88. More investigation necessary ❖ CommonJS Modules ❖ Polyfills for Nashorn (nashorn-polyfill.js) ❖ Compile JavaScript to one file ❖ WebJars
  • 90. Conclusion: JS in DB ❖ Interesting to follow and use when needed ❖ Need a specific skill-set ❖ Not that many “advanced” examples
  • 91. 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
  • 93. ❖ Looking for consulting, training and development in Oracle Application Express (APEX)? ❖ Contact : www.apexRnD.be ❖ Mail : info@apexRnD.be Consulting, Development, Training