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

Performance Tuning With Oracle ASH and AWR. Part 1 How And What
Performance Tuning With Oracle ASH and AWR. Part 1 How And WhatPerformance Tuning With Oracle ASH and AWR. Part 1 How And What
Performance Tuning With Oracle ASH and AWR. Part 1 How And What
udaymoogala
 
Oracle db performance tuning
Oracle db performance tuningOracle db performance tuning
Oracle db performance tuning
Simon Huang
 

What's hot (20)

Reporting with Oracle Application Express (APEX)
Reporting with Oracle Application Express (APEX)Reporting with Oracle Application Express (APEX)
Reporting with Oracle Application Express (APEX)
 
DBIx::Class beginners
DBIx::Class beginnersDBIx::Class beginners
DBIx::Class beginners
 
Spring Web Service, Spring Integration and Spring Batch
Spring Web Service, Spring Integration and Spring BatchSpring Web Service, Spring Integration and Spring Batch
Spring Web Service, Spring Integration and Spring Batch
 
Performance Tuning With Oracle ASH and AWR. Part 1 How And What
Performance Tuning With Oracle ASH and AWR. Part 1 How And WhatPerformance Tuning With Oracle ASH and AWR. Part 1 How And What
Performance Tuning With Oracle ASH and AWR. Part 1 How And What
 
[Pgday.Seoul 2021] 2. Porting Oracle UDF and Optimization
[Pgday.Seoul 2021] 2. Porting Oracle UDF and Optimization[Pgday.Seoul 2021] 2. Porting Oracle UDF and Optimization
[Pgday.Seoul 2021] 2. Porting Oracle UDF and Optimization
 
PostgreSQL and JDBC: striving for high performance
PostgreSQL and JDBC: striving for high performancePostgreSQL and JDBC: striving for high performance
PostgreSQL and JDBC: striving for high performance
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuning
 
ProxySQL on Kubernetes
ProxySQL on KubernetesProxySQL on Kubernetes
ProxySQL on Kubernetes
 
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
 
Oracle db performance tuning
Oracle db performance tuningOracle db performance tuning
Oracle db performance tuning
 
Actions rules and workflow in alfresco
Actions rules and workflow in alfrescoActions rules and workflow in alfresco
Actions rules and workflow in alfresco
 
REST API debate: OData vs GraphQL vs ORDS
REST API debate: OData vs GraphQL vs ORDSREST API debate: OData vs GraphQL vs ORDS
REST API debate: OData vs GraphQL vs ORDS
 
All of the Performance Tuning Features in Oracle SQL Developer
All of the Performance Tuning Features in Oracle SQL DeveloperAll of the Performance Tuning Features in Oracle SQL Developer
All of the Performance Tuning Features in Oracle SQL Developer
 
超簡単! Strawberry PerlをWindowsにインストール
超簡単! Strawberry PerlをWindowsにインストール超簡単! Strawberry PerlをWindowsにインストール
超簡単! Strawberry PerlをWindowsにインストール
 
MySQL Performance Schema in MySQL 8.0
MySQL Performance Schema in MySQL 8.0MySQL Performance Schema in MySQL 8.0
MySQL Performance Schema in MySQL 8.0
 
Oracle data guard for beginners
Oracle data guard for beginnersOracle data guard for beginners
Oracle data guard for beginners
 
Snowflake SnowPro Certification Exam Cheat Sheet
Snowflake SnowPro Certification Exam Cheat SheetSnowflake SnowPro Certification Exam Cheat Sheet
Snowflake SnowPro Certification Exam Cheat Sheet
 
Introduction To Catalyst - Part 1
Introduction To Catalyst - Part 1Introduction To Catalyst - Part 1
Introduction To Catalyst - Part 1
 
Why oracle data guard new features in oracle 18c, 19c
Why oracle data guard new features in oracle 18c, 19cWhy oracle data guard new features in oracle 18c, 19c
Why oracle data guard new features in oracle 18c, 19c
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계
 

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 (16)

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

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Recently uploaded (20)

08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 

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