Page 1
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
APEX_JSON ist nicht alles. JSON-Funktionen der Oracle DB
Dr. Beda Hammerschmidt, Oracle Corporation Carsten Czarski, ORACLE Deutschland B.V. Co KG Follow me on twitter: @bch_t, @cczarski
Oracle Confidential – Internal/Restricted/Highly Restricted
Page 2
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
JSON UND APEX 5.0: APEX_JSON APEX_JSON ist nicht alles. JSON-Funktionen der Oracle DB
Page 3
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
JSON und PL/SQL: APEX_JSON
• Mit APEX 5.0 eingeführt
– Teil der APEX-Installation
– Aber auch außerhalb von APEX oder ganz ohne APEX nutzbar
• Einfaches Erzeugen oder Parsen von JSON-Dateien – Basiert auf Open Source
– Direktes Schreiben in den HTP Buffer oder in einen CLOB
– SQL-Unterstützung für JSON ist Teil der Datenbank ab 12.1.0.2
https://docs.oracle.com/cd/E59726_01/doc.50/e39149/apex_json.htm#AEAPI29635
Page 4
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
JSON erzeugen mit PL/SQL
• PL/SQL-Package APEX_JSON
– Basiert auf Open Source PL/JSON
– Mit APEX 5.0 installiert
– Auch ohne APEX nutzbar
• JSON "programmatisch" erstellen
– Objekte mit OPEN|CLOSE_OBJECT
– Arrays mit OPEN|CLOSE_ARRAY
– Attribute mit WRITE
Page 5
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
JSON erzeugen mit APEX_JSON
• Ausgabe in einen CLOB
– Generisch nutzbar
– Ausgabe erfolgt in temp. LOB • Cache: TRUE fast immer richtig
• Dur: SESSION oder CALL
– Wichtig: LOB ggfs. freigeben
• Ausgabe in den HTP Buffer
– Für Web-Anwendungen (APEX)
– Header und Browser-Caching setzen
Oracle Confidential – Internal/Restricted/Highly Restricted 5
PROCEDURE INITIALIZE_CLOB_OUTPUT Argument Name Typ --------------------------- --------------- P_DUR BINARY_INTEGER P_CACHE BOOLEAN P_INDENT BINARY_INTEGER PROCEDURE INITIALIZE_OUTPUT Argument Name Typ --------------------------- --------------- P_HTTP_HEADER BOOLEAN P_HTTP_CACHE BOOLEAN P_HTTP_CACHE_ETAG VARCHAR2 P_INDENT BINARY_INTEGER
Page 6
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
JSON dynamisch erzeugen – per Cursor
SQL> select make_json(cursor(select * from emp)) as json_clob from dual; JSON_CLOB -------------------------------------------------------------------------------- {"query": [ { "EMPNO":7369 , "ENAME":"SMITH" , "JOB":"CLERK" , "MGR":7902 , "HIREDATE":"1980-12-17T00:00:00Z" , "SAL":800 , "DEPTNO":20 } , { : } ] }
http://sql-plsql-de.blogspot.com/2015/05/apexjson-ohne-apex-json-erzeugen-mit.html
Page 7
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
APEX_JSON: JSON parsen
• APEX_JSON.PARSE
– JSON-Parsing und Ablage in Memory
– Zugriff mit GET_XXX Aufrufen
Page 8
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
APEX_JSON: JSON parsen
• APEX_JSON.PARSE
– JSON-Parsing und Ablage in Memory
– Zugriff mit GET_XXX Aufrufen
• Alternativ: Umweg über XMLTYPE
– Danach XML-Parsing
– Mehr Möglichkeiten
Page 9
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
ENABLE FAST APPLICATION DEVELOPMENT Native JSON Unterstützung in der Oracle Datenbank
9
Page 10
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Anforderungen agiler Anwendungsentwicklung
• Schema-Flexibilität
– Endgültiges Schema zu Beginn unbekannt
– Hinzufügen oder Wegfallen von Feldern
– Kardinalitäten ändern sich
– Daten mit altem Schema beibehalten,
– "Data First - Schema Later or Never"
• Zugriff von verschiedenen Clients und Programmiersprachen
• Skalierbarkeit, Cloud Deployment, ….
Oracle Confidential – Internal/Restricted/Highly Restricted 10
Page 11
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Anforderungen agiler Anwendungsentwicklung
• Schema-Flexibilität
– Endgültiges Schema zu Beginn unbekannt
– Hinzufügen oder Wegfallen von Feldern
– Kardinalitäten ändern sich
– Daten mit altem Schema beibehalten,
– "Data First - Schema Later or Never"
• Zugriff von verschiedenen Clients, Programmiersprachen
• Skalierbarkeit, Cloud Deployment, ….
Oracle Confidential – Internal/Restricted/Highly Restricted 11
"Wir brauchen eine NoSQL Datenbank" Aber was ist mit … Abfragesprache, Transaktionen, OLTP oder OLAP, Enterprise Features, Product Maturity, Security, Betriebskonzept, etc …?
Page 12
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Schemaless Development mit Oracle12c und JSON
12
Zugriffe per SQL oder per API • SQL/JSON-Funktionen: JSON-Zugriffe mit SQL
• REST API: Zugriffe per API via HTTP – ohne SQL HTTP(S) client
JSON
JSON in der Datenbank speichern • Kein festes Schema mehr nötig • JSON-Dokumente beschreiben sich selbst
Page 13
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Wie genau geht das?
Oracle Confidential – Internal/Restricted/Highly Restricted 13
Storage
Indexing
SQL/JSON Queries
REST/Java Apis
Page 14
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Wie genau geht das?
• JSON als VARCHAR2, CLOB oder BLOB
– Kein eigener Datentyp – mit Absicht!
– Check Constraint IS JSON stellt JSON Syntax sicher
CREATE TABLE jtab( id NUMBER, jcol CLOB, CONSTRAINT c1 CHECK(jcol IS JSON));
– Alle Clients können JSON nutzen JDBC, OCI, PHP, node.js, APEX, …
– Alle DB-Features mit JSON nutzbar Import/Export, Replication, Golden Gate, …
Oracle Confidential – Internal/Restricted/Highly Restricted 14
Storage
Indexing
SQL/JSON Queries
REST/Java Apis
Page 15
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Wie genau geht das?
• SQL/JSON Standard für Abfragen – JSON_VALUE
– JSON_QUERY
– JSON_EXISTS
– JSON_TABLE
• Navigation in JSON ähnlich JavaScript
– $.address[0].city
Oracle Confidential – Internal/Restricted/Highly Restricted 15
Storage
Indexing
SQL/JSON Queries
REST/Java Apis
SELECT jtab.jsol.text, jtab.jcol.user.screenName FROM jsontab;
Page 16
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
SQL/JSON: Beispiel 1
Oracle Confidential – Internal/Restricted/Highly Restricted 16
SELECT JSON_VALUE(jcol, '$.id') FROM jtab; --------------------------------- 578903819884585000
{ "id": 578903819884585000, "text": "RT @iAdvise_live: #countdown naar #Apexworld @OGh_nl #iadvise_live @Yvke1983 geeft met #Robeco een client case over #twitterbootstrap", "geo": { "type": "Point", "coordinates": [ 37.78217, -122.40062 ] }, "lang": "nl", "retweet_count": 2, "created_at": "Fri Mar 20 13:00:00 +0000 2015", "user": { "statuses_count": 266, "lang": "en", "id": 1568150293, "favourites_count": 62, "name": "Jonathan van Vianen", "screen_name": "jvanvianen78", "followers_count": 187, "friends_count": 493 } }
Page 17
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
SQL/JSON Beispiel 2
Oracle Confidential – Internal/Restricted/Highly Restricted 18
{ "id": 578903819884585000, "text": "RT @iAdvise_live: #countdown naar #Apexworld @OGh_nl #iadvise_live @Yvke1983 geeft met #Robeco een client case over #twitterbootstrap", "geo": { "type": "Point", "coordinates": [ 37.78217, -122.40062 ] }, "lang": "nl", "retweet_count": 2, "created_at": "Fri Mar 20 13:00:00 +0000 2015", "user": { "statuses_count": 266, "lang": "en", "id": 1568150293, "favourites_count": 62, "name": "Jonathan van Vianen", "screen_name": "jvanvianen78", "followers_count": 187, "friends_count": 493 } }
SELECT JSON_QUERY(jcol, '$.user' FROM jtab; ---------------------------------------- { "statuses_count": 266, "lang": "en", "id": 1568150293, "favourites_count": 62, "name": "Jonathan van Vianen", "screen_name": "jvanvianen78", "followers_count": 187, "friends_count": 493 }
Page 18
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
SQL/JSON Beispiel 3
Oracle Confidential – Internal/Restricted/Highly Restricted 19
{ "id": 578903819884585000, "text": "RT @iAdvise_live: #countdown naar #Apexworld @OGh_nl #iadvise_live @Yvke1983 geeft met #Robeco een client case over #twitterbootstrap", "geo": { "type": "Point", "coordinates": [ 37.78217, -122.40062 ] }, "lang": "nl", "retweet_count": 2, "created_at": "Fri Mar 20 13:00:00 +0000 2015", "user": { "statuses_count": 266, "lang": "en", "id": 1568150293, "favourites_count": 62, "name": "Jonathan van Vianen", "screen_name": "jvanvianen78", "followers_count": 187, "friends_count": 493 } }
SELECT jt.* FROM jtab, JSON_TABLE( jcol, '$' COLUMNS ( "ID" NUMBER PATH '$.id' "TEXT" PATH '$.text', "LANG" PATH '$.lang' DEFAULT ‘???' ON ERROR, "USR " VARCHAR2(40) PATH '$.user.name', "FOLLOWER" NUMBER PATH '$.followers_count', "FRIENDS" NUMBER PATH '$.friends_count' ) ) jt; ID TEXT LANG USR FOLLOWER FRIENDS --------------------------------------------------- 578903 RT @i nl Jonathan 187 493
Page 19
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
SQL/JSON Beispiel 4
Oracle Confidential – Internal/Restricted/Highly Restricted 20
{ "id": 578903819884585000, "text": "RT @iAdvise_live: #countdown naar #Apexworld @OGh_nl #iadvise_live @Yvke1983 geeft met #Robeco een client case over #twitterbootstrap", "geo": { "type": "Point", "coordinates": [ 37.78217, -122.40062 ] }, "lang": "nl", "retweet_count": 2, "created_at": "Fri Mar 20 13:00:00 +0000 2015", "user": { "statuses_count": 266, "lang": "en", "id": 1568150293, "favourites_count": 62, "name": "Jonathan van Vianen", "screen_name": "jvanvianen78", "followers_count": 187, "friends_count": 493 } }
CREATE OR REPLACE VIEW TwitterV AS SELECT jt.* FROM jtab, JSON_TABLE( jcol, '$' COLUMNS ( "ID" NUMBER PATH '$.id' "TEXT" PATH '$.text', "LANG" PATH '$.lang' DEFAULT ‘???' ON ERROR, "USR“ VARCHAR2(40) PATH '$.user.name', "FOLLOWER" NUMBER PATH '$.followers_count', "FRIENDS" NUMBER PATH '$.friends_count' ) ) jt;
Page 20
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
SQL/JSON Beispiel 4
Oracle Confidential – Internal/Restricted/Highly Restricted 21
{ "id": 578903819884585000, "text": "RT @iAdvise_live: #countdown naar #Apexworld @OGh_nl #iadvise_live @Yvke1983 geeft met #Robeco een client case over #twitterbootstrap", "geo": { "type": "Point", "coordinates": [ 37.78217, -122.40062 ] }, "lang": "nl", "retweet_count": 2, "created_at": "Fri Mar 20 13:00:00 +0000 2015", "user": { "statuses_count": 266, "lang": "en", "id": 1568150293, "favourites_count": 62, "name": "Jonathan van Vianen", "screen_name": "jvanvianen78", "followers_count": 187, "friends_count": 493 } }
CREATE OR REPLACE VIEW TwitterV AS SELECT jt.* FROM jtab, JSON_TABLE( jcol, '$' COLUMNS ( "ID" NUMBER PATH '$.id' : "FRIENDS" NUMBER PATH '$.friends_count' ) ) jt; -- Find most active German Tweeter SELECT usr, count(1) "COUNT" FROM tweetv WHERE lang = 'de' GROUP BY usr ORDER BY "COUNT" DESC FETCH FIRST 10 ROWS ONLY; USR COUNT ------------------------------ flederbine 28 cczarski 18 : :
Page 21
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Wie genau geht das?
• B-Tree/Bitmap Index
– CREATE INDEX id_idx ON jtab (jtab.jcol.id);
– CREATE BITMAP INDEX lang_idx ON jtab (jtab.jcol.lang);
– Felder müssen bekannt sein
• JSON Search Index
– Indiziert alle Felder als "Volltextindex"
– Ideal für unbekannte Daten
– CREATE INDEX po_search_idx ON j_purchaseorder (po_document) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ( 'section group CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT)' );
Oracle Confidential – Internal/Restricted/Highly Restricted 22
Storage
Indexing
SQL/JSON Queries
REST/Java Apis
Page 22
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Wie genau geht das?
Oracle Confidential – Internal/Restricted/Highly Restricted 23
Storage
Indexing
SQL/JSON Queries
REST/Java Apis
• REST Abstraktion für Tabellen und SQL
• Collection JSON-Sammlung
• REST Endpoints (GET, PUT, DELET, POST)
• JSON-Query Language
{"lang": "nl"} {"and":[ {"lang": "nl"}, {"retweet_count":{"$gt":3}} ]}
Page 23
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
REST-Sicht auf eine JSON-Collection ( Tabelle)
Oracle Confidential – Internal/Restricted/Highly Restricted 24
Page 24
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Oracle REST Data Services (ORDS)
Oracle12c
Standard-REST-Aufrufe GET, PUT, POST HTTP, HTTPS
REST Client
JSON
JSON in der Datenbank SQL Queries APEX Anwendungen
Oracle REST Data Services
URI JSON Collection API Auto Generated SQL
Transform JSON Rückgabe JSON
REST Data Services - No need for developers to write SQL - REST is stateless – no need to manage sessions or transactions
25
Page 25
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
JSON in der Oracle-Datenbank: Zusammenfassung
26
Access JSON documents using RESTful API
PUT /my_database/my_schema/customers HTTP/1.0 Content-Type: application/json Body: { "firstName": "John", “lastName”: "Smith", "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021“, "isBusiness" : false }, "phoneNumbers": [ {"type": "home", "number": "212 555-1234"}, {"type": "fax", "number": "646 555-4567"} ] }
select c.json_document.firstName, c.json_document.lastName, c.json_document.address.city from customers c; FIRSTNAME LASTNAME CITY ----------- ----------- -------------- John Smith New York : : :
Query JSON using SQL
Oracle Database 12c
JSON
Page 26
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
JSON UND ORACLE12C IN APEX NUTZEN Das Zusammenspiel
27
Page 27
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Twitter Analyse mit SQL/JSON und APEX
Oracle Confidential – Internal/Restricted/Highly Restricted 28
Page 28
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Twitter Analyse mit SQL/JSON und APEX
Oracle Confidential – Internal/Restricted/Highly Restricted 29
Page 29
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Twitter Analyse mit SQL/JSON und APEX
Oracle Confidential – Internal/Restricted/Highly Restricted 30
Page 30
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Twitter Analyse mit SQL/JSON und APEX
Oracle Confidential – Internal/Restricted/Highly Restricted 31
Page 31
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
#apexsummer15
• APEX 5.0 Summer School 2015 – 8 Webinare – Juli 2015 – Mittwochs und Freitags
• Alles über APEX 5.0 – Page Designer, Universal Theme, SQL und PL/SQL, Migration,
Interactive Reports, Plug-Ins, Sample Applications und mehr …
• Von den deutschsprachigen Community-Experten – Peter Raganitsch, Niels de Bruijn, Oliver Lemm, Denes Kubicek,
Tobias Arnhold, Dietmar Aust, Christian Rokitta, Carsten Czarski, Jürgen Schuster
Oracle Confidential – Internal/Restricted/Highly Restricted 32
tinyurl.com/orclapexsummerschool
Page 32
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
http://blogs.oracle.com/apexcommunity_deutsch
Page 33
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
[email protected] http://blogs.oracle.com/jsondb Twitter: @bch_t
[email protected]
http://tinyurl.com/apexcommunity http://sql-plsql-de.blogspot.com
Twitter: @cczarski
Page 34
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |