Upload
hoangdung
View
225
Download
0
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
ENABLE FAST APPLICATION DEVELOPMENT Native JSON Unterstützung in der Oracle Datenbank
9
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
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 …?
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
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
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
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;
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 } }
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 }
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
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;
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 : :
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
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}} ]}
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
REST-Sicht auf eine JSON-Collection ( Tabelle)
Oracle Confidential – Internal/Restricted/Highly Restricted 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
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
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
JSON UND ORACLE12C IN APEX NUTZEN Das Zusammenspiel
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
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Twitter Analyse mit SQL/JSON und APEX
Oracle Confidential – Internal/Restricted/Highly Restricted 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
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Twitter Analyse mit SQL/JSON und APEX
Oracle Confidential – Internal/Restricted/Highly Restricted 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
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
http://blogs.oracle.com/apexcommunity_deutsch
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
[email protected] http://blogs.oracle.com/jsondb Twitter: @bch_t
http://tinyurl.com/apexcommunity http://sql-plsql-de.blogspot.com
Twitter: @cczarski
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |