json support in db2 for z/os

46
Learning Exciting JSON Features in DB2 for z/OS Jane Man, IBM Session Code: F5 Monday, 16 November 2015 17:00-18:00 Platform: DB2 for z/OS

Upload: jane-man

Post on 16-Feb-2017

960 views

Category:

Data & Analytics


7 download

TRANSCRIPT

Page 1: JSON Support in DB2 for z/OS

Learning Exciting JSON Features in DB2 for z/OS

Jane Man, IBM

Session Code: F5Monday, 16 November 2015 17:00-18:00Platform: DB2 for z/OS

Page 2: JSON Support in DB2 for z/OS

Objectives

• To illustrate JSON storage model in DB2 for z/OS

• To introduce JSON SQL APIs features and examples

• To share tips and pitfalls of implementing an JSON solution

22

Page 3: JSON Support in DB2 for z/OS

Please Note

• IBM’s statements regarding its plans, directions, and intent are subject to change or

withdrawal without notice at IBM’s sole discretion.

• Information regarding potential future products is intended to outline our general product direction and it should not be relied on in making a purchasing decision.

• The information mentioned regarding potential future products is not a commitment, promise, or legal obligation to deliver any material, code or functionality. Information about potential future products may not be incorporated into any contract.

• The development, release, and timing of any future features or functionality described for our products remains at our sole discretion.

• Performance is based on measurements and projections using standard IBM benchmarks in a controlled environment. The actual throughput or performance that any user will experience will vary depending upon many factors, including considerations such as the amount of multiprogramming in the user’s job stream, the I/O configuration, the storage configuration, and the workload processed. Therefore, no assurance can be given that an individual user will achieve results similar to those stated here.

3

Page 4: JSON Support in DB2 for z/OS

Agenda

• Motivations for NoSQL in the Enterprise• New era applications

• JSON and JSON document stores

• Blending JSON and traditional relational

• DB2 JSON Technology• SQL APIs

• JSON and XML

• Summary and Q&A

4

Page 5: JSON Support in DB2 for z/OS

JSON is the Language of the Web• JavaScript Object Notation

• Lightweight data interchange format

• Specified in IETF RFC 4627

• http://www.JSON.org

• Designed to be minimal, portable, textual and a subset of JavaScript

• Only 6 kinds of values!

• Easy to implement and easy to use

• Text format, so readable by humans and machines

• Language independent, most languages have features that map easily to JSON

• Used to exchange data between programs written in all modern programming languages

{"firstName“ : "John","lastName" : "Smith","age" : 25,“active” : true,“freqflyer_num : null,

"address" :{

"streetAddress“ : "21 2nd Street","city" : "New York","state" : "NY","postalCode" : "10021"

},

"phoneNumber“ :[

{"type" : "home","number“ : "212 555-1234"

},{

"type" : “mobile","number“ : "646 555-4567"

}]

}

5

Page 6: JSON Support in DB2 for z/OS

New Era Application Requirements

• Store data from web/mobile apps in it's native form

• New web applications use JSON for storing and exchanging information

• Very lightweight – write more efficient apps

• It is also the preferred data format for mobile application back-ends

• Move from development to production in no time!

• Ability to create and deploy flexible JSON schema

• Gives power to application developers by reducing dependency on IT; no need to pre-determine schemas and create/modify tables

• Ideal for agile, rapid development and continuous integration

DB2

6

Page 7: JSON Support in DB2 for z/OS

• Combine data from “systems of engagement” with core enterprise data

• Simplicity and agility of JSON + enterprise strengths of DB2

• Maintains JSON simplicity and agility

• Interoperate seamlessly with modern applications

• Flexible schemas allow rapid delivery of applications

• Leverages DB2 Qualities of Services

• Security

• Management, operations

• High availability

• Delivers the best of both worlds

• Schema Agility and Enterprise Quality of Service

DB2 for z/OS Enterprise-class JSON DatabaseAgility with DB2 Qualities of Service

7

Page 8: JSON Support in DB2 for z/OS

8

SQL APIs for JSON(recommended)

Page 9: JSON Support in DB2 for z/OS

JSON in SQL – First StepsExtend JSON API Building blocks for external use

New functions released in DB2 11 only

• JSON2BSON - convert JSON string into BSON format

• BSON2JSON - convert BSON LOB into JSON string

• JSON_VAL - retrieve specific value from inside a BSON object (also in V10)

INSERT INTO EMPLOYEE(data) VALUES (SYSTOOLS.JSON2BSON(‘{ name: "Joe", age:28, isManager: false, jobs :[“QA”, “Developer”] } ’))

SELECT SYSTOOLS.BSON2JSON(data) FROM EMPLOYEE

UPDATE EMPLOYEE SET DATA =

SYSTOOLS.JSON2BSON('{ name: "Jane", age:18, isManager: false, jobs :["Developer", "Team Lead"] } ')

JSON is stored internally as BSON format in inline BLOB column

9

Page 10: JSON Support in DB2 for z/OS

Definition of JSON2BSON and BSON2JSONCREATE FUNCTION SYSTOOLS.JSON2BSON

( INJSON CLOB(16M) ) RETURNS BLOB(16M) SPECIFIC JSON2BSON LANGUAGE C PARAMETER STYLE SQL PARAMETER CCSID UNICODE NO SQL WLM ENVIRONMENT

DSNWLM_GENERAL RUN OPTIONS 'XPLINK(ON)' PROGRAM TYPE SUB DETERMINISTIC DISALLOW PARALLEL DBINFO RETURNS NULL ON NULL INPUT NO EXTERNAL ACTION

EXTERNAL NAME 'DSN5JSJB';

CREATE FUNCTION SYSTOOLS.BSON2JSON

( INBSON BLOB(16M) ) RETURNS CLOB(16M) SPECIFIC BSON2JSON LANGUAGE C PARAMETER STYLE SQL PARAMETER CCSID UNICODE WLM ENVIRONMENT

DSNWLM_GENERAL RUN OPTIONS 'XPLINK(ON)' DBINFO PROGRAM TYPE SUB DISALLOW PARALLEL NO SQL DETERMINISTIC RETURNS NULL ON NULL INPUT NO EXTERNAL ACTION EXTERNAL NAME 'DSN5JSBJ';

10

Page 11: JSON Support in DB2 for z/OS

JSON_VAL Built-in function

>>-JSON_VAL—(--json-value--,--search-string--,--result-type--)---------><

To extract and retrieve JSON data into SQL data types from BSON.

The JSON_VAL function returns an element of a JSON document identified by the JSON field name specified in search-string. The value of the JSON element is returned in the data type and length specified in result-type

Result-type Function return type / length

'n' DECFLOAT(34)

'i' INTEGER

'l' BIGINT

'f' DOUBLE

'd' DATE

'ts' TIMESTAMP

't' TIME

's:n' VARCHAR (n)

'b:n' VARCHAR(n) FOR BIT DATA

'u' INTEGER / 4 Example:

JSON_VAL(DATA,'PO.customer.@cid', 'i:na') PI39003 remove the requirement

that 1st parameter has to be a BLOB column

11

Page 12: JSON Support in DB2 for z/OS

SQL APIs Examples – Create Table and Index

Create a table to store JSON dataCREATE TABLE JSONPO( ID VARBIN(12) NOT NULL,

DATA BLOB(16M) INLINE LENGTH 25000, PRIMARY KEY(ID)) CCSID UNICODE

Create a JSON IndexCREATE INDEX IX1 ON JSONPO(

JSON_VAL(DATA, 'PO.customer.@cid','i:na'))

……

03420000001069640009000000027374617465000300000054580002636…0x534c634eebc86271625f39d4

ID DATA

Unique primary key. Can

be fixed type or varying

type.

BLOB Column – holds

the BSON document.

12

Page 13: JSON Support in DB2 for z/OS

SQL APIs Examples – Insert a JSON documentINSERT INTO JSONPO VALUES (123,SYSTOOLS.JSON2BSON(

'{"PO":{"@id": 101, "@orderDate": "2014-11-18", "customer": {"@cid": 999}, "items": {

"item": [{"@partNum": "872-AA", "productName": "Lawnmower", "quantity": 1, "USPrice": 149.99, "shipDate": "2014-11-20"

}, {"@partNum": "945-ZG", "productName": "Sapphire Bracelet", "quantity": 2, "USPrice": 178.99, "comment": "Not shipped"

} ]

} } }'))

JSON2BSON () is used

to convert text format of

JSON to BSON

13

Page 14: JSON Support in DB2 for z/OS

Select JSON document

Select a whole JSON document

SELECT SYSTOOLS.BSON2JSON(DATA) FROM JSONPO

Select part of a JSON document

Find the first productName for customer cid=999

SELECT JSON_VAL(DATA, 'PO.items.item.0.productName', 's:10') FROM JSONPO WHERE JSON_VAL(DATA,'PO.customer.@cid', 'i:na') = 999

BSON2JSON () is used

to convert BSON to text

format of JSON

To enable index

access, use same

pattern as that in the

JSON index

JSON_VAL is a built-in functions to

extract and retrieve JSON data into

SQL data types from BSON objects

what will be returned?

Lawnmower

14

Page 15: JSON Support in DB2 for z/OS

More SQL APIs ExamplesSort JSON documentsSELECT SYSTOOLS.BSON2JSON(DATA)FROM JSONPO ORDER BY JSON_VAL(DATA, 'PO.customer.@cid', 'i:na') DESC

Update a JSON documentUPDATE JSONPOSET DATA = SYSTOOLS.JSON2BSON(

'{"Customer":{"@cid": 777, "name": "George", "age": 29, "telephone": "566-898-1111","country": "USA"

}}')WHERE JSON_VAL(DATA, ‘PO.customer.@cid', 'i:na') = 999

Delete a JSON documentDELETE JSONPO WHERE JSON_VAL(DATA, ‘PO.customer.@cid', 'i:na') = 999

Whole document

update

15

Page 16: JSON Support in DB2 for z/OS

JSON Enhancements – More with PI39003

>>-JSON_VAL—(--json-value--,--search-string--,--result-type--)---------><

To extract and retrieve JSON data into SQL data types from BSON.

Example (before):

JSON_VAL(column1,'PO.cust

omer.@cid', 'i:na')

In PI39003, JSON_VAL built-in function has

been extended to support any

expression that returns a BLOB value for

argument of

json-value parameter.

In PI39003, we support more as 1st parameter:

• View/table expression column

• Any expressions (CASE, CAST, etc.) that return BLOB data type

• Trigger transition variable

• SQL PL variable/parameter

16

Page 17: JSON Support in DB2 for z/OS

More with PI39003

17

CASE Expression

SELECT JSON_VAL(

CASE WHEN ID < 1

THEN DATA

ELSE SYSTOOLS.JSON2BSON(TEXT)

END,

'PO.customer.@cid',

'i:na')

View Column

CREATE VIEW V1 (VC1) AS

SELECT DATA

FROM JSONPO1

WHERE JSON_VAL(DATA,

'PO.@orderDate', 'd:na') >

CURRENT DATE;

SELECT JSON_VAL(VC1,

'PO.customer.@cid', 'i:na')

FROM V1

Table Expression with Union all

SELECT JSON_VAL(TX.C1, 'PO.customer.@cid' , 'i:na')

FROM (SELECT DATA FROM JSONPO1

UNION ALL

SELECT DATA FROM JSONPO2

) TX(C1)

WHERE JSON_VAL(TX.C1, 'PO.customer.@cid' , 'i:na') > 900;

Page 18: JSON Support in DB2 for z/OS

More with PI39003 (Cont’d)

18

Trigger Transition Variable

CREATE TRIGGER TRIG1

NO CASCADE BEFORE INSERT ON JSONPO1

REFERENCING NEW AS N

FOR EACH ROW

MODE DB2SQL

WHEN (JSON_VAL(N.DATA, 'PO.@orderDate', 'd') >

CURRENT_DATE + 300 DAYS

OR JSON_VAL(N.DATA, 'PO.@orderDate', 'd') <

CURRENT_DATE)

BEGIN ATOMIC

SIGNAL SQLSTATE '75002'

SET MESSAGE_TEXT = 'Order date is out of range';

END

CREATE TABLE JSONPO1 (

ID VARCHAR(10) NOT NULL,

DATA BLOB(1M) INLINE

LENGTH 25000,…

Page 19: JSON Support in DB2 for z/OS

More with PI39003 (Cont’d)

19

SQL PL Variable/Parameter

CREATE TYPE INTARRAY AS INTEGER ARRAY [20]!

CREATE PROCEDURE MYSP1(IN JSONDATA BLOB(16M))

LANGUAGE SQL

BEGIN

DECLARE POID INTARRAY;

DECLARE CUSTID INTEGER;

SET POID =

ARRAY[SELECT JSON_VAL(DATA, 'PO.@id', 'i:na')

FROM JSONPO1];

SELECT JSON_VAL(JSONDATA, 'PO.customer.@cid', 'i:na')

INTO CUSTID

FROM SYSIBM.SYSDUMMY1;

END!

Page 20: JSON Support in DB2 for z/OS

• Other DB2 for z/OS JSON UDFs• SYSTOOLS.JSON_LEN

• SYSTOOLS.JSON_TYPE

• SYSTOOLS.JSON_TABLE

• Briefly discussed in DB2 11 for z/OS performance guide : http://www.redbooks.ibm.com/redbooks/pdfs/sg248222.pdf

20

Page 21: JSON Support in DB2 for z/OS

SYSTOOLS.JSON_LEN

21

CREATE FUNCTION SYSTOOLS.JSON_LEN ( INJSON BLOB(16M) , INELEM VARCHAR(2048) ) RETURNS INTEGER

This function returns the size of array of elements in JSON data, and returns NULL if anelement is not an array. '{"PO":{"@id": 101,

"@orderDate": "2014-11-18",

"customer": {"@cid": 999},

"items": {

"item": [{"@partNum": "872-AA",

"productName": "Lawnmower",

"quantity": 1,

"USPrice": 149.99,

"shipDate": "2014-11-20"

},

{"@partNum": "945-ZG",

"productName": "Sapphire Bracelet",

"quantity": 2,

"USPrice": 178.99,

"comment": "Not shipped"

}

]

}

}

}

Example:SELECT SYSTOOLS.JSON_LEN(DATA, 'PO.items.item') AS "# of entry in PO.items.item"FROM JSONPO;

Output:# of entry in PO.items.item2

1 record(s) selected

Page 22: JSON Support in DB2 for z/OS

SYSTOOLS.JSON_TYPE

22

CREATE FUNCTION SYSTOOLS.JSON_TYPE

( INJSON BLOB(16M)

, INELEM VARCHAR(2048)

, MAXLENGTH INTEGER

)

RETURNS INTEGER

This function returns the type of JSON data.

'{"PO":{"@id": 101,

"@orderDate": "2014-11-18",

"customer": {"@cid": 999},

"items": {

"item": [{"@partNum": "872-AA",

"productName": "Lawnmower",

"quantity": 1,

"USPrice": 149.99,

"shipDate": "2014-11-20"

},

{"@partNum": "945-ZG",

"productName": "Sapphire Bracelet",

"quantity": 2,

"USPrice": 178.99,

"comment": "Not shipped"

}

]

}

}

}

Example:

SELECT SYSTOOLS.JSON_TYPE(DATA, 'PO.items.item.productName', 20) AS "JSON_TYPE“ FROM JSONPO;

JSON_TYPE 2

Example:

SELECT SYSTOOLS.JSON_TYPE(DATA, 'PO.items.item.USPrice', 20) AS "JSON_TYPE“ FROM JSONPO;

JSON_TYPE 1

Page 23: JSON Support in DB2 for z/OS

SYSTOOLS.JSON_TABLE

23

CREATE FUNCTION

SYSTOOLS.JSON_TABLE

( INJSON BLOB(16M)

, INELEM VARCHAR(2048)

, RETTYPE VARCHAR(100)

)

RETURNS TABLE

( TYPE INTEGER

, VALUE VARCHAR(2048)

)

This function returns array of elements in JSON data.

Example:SELECT X.* FROM JSONPO, TABLE(SYSTOOLS.JSON_TABLE(DATA, 'PO.items.item.productName', 's:20')) X

Output:TYPE VALUE 2 Lawnmower 2 Sapphire Bracelet

'{"PO":{"@id": 101,

"@orderDate": "2014-11-18",

"customer": {"@cid": 999},

"items": {

"item": [{"@partNum": "872-AA",

"productName": "Lawnmower",

"quantity": 1,

"USPrice": 149.99,

"shipDate": "2014-11-20"

},

{"@partNum": "945-ZG",

"productName": "Sapphire Bracelet",

"quantity": 2,

"USPrice": 178.99,

"comment": "Not shipped"

}

]

}

}

}

Page 24: JSON Support in DB2 for z/OS

SYSTOOLS.JSON_TABLE

24

Example:SELECT X.* FROM JSONPO, TABLE(SYSTOOLS.JSON_TABLE(DATA, 'PO.items.item', 's:200')) X

'{"PO":{"@id": 101,

"@orderDate": "2014-11-18",

"customer": {"@cid": 999},

"items": {

"item": [{"@partNum": "872-AA",

"productName": "Lawnmower",

"quantity": 1,

"USPrice": 149.99,

"shipDate": "2014-11-20"

},

{"@partNum": "945-ZG",

"productName": "Sapphire Bracelet",

"quantity": 2,

"USPrice": 178.99,

"comment": "Not shipped"

}

]

}

}

}

Output:

TYPE VALUE

3 {@partNum:"872-

AA",productName:"Lawnmower",quantity:1,USPrice:149.990000,shipDate:"2014-11-

20"}

3 {@partNum:"945-ZG",productName:"Sapphire

Bracelet",quantity:2,USPrice:178.990000,comment:"Not shipped"}

Page 25: JSON Support in DB2 for z/OS

JSON_TABLE + JSON_VAL : convert JSON to Relational

25

Example:SELECT

JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), '@partNum', 's:10') as "@partNum",JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'productName', 's:20') as "productName",JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'quantity', 'i') as "quantity",JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'USPrice', 'f') as "USPrice",JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'shipDate', 's:20') as "shipDate"

FROM JSONPO,TABLE(SYSTOOLS.JSON_TABLE(DATA, 'PO.items.item', 's:200')) X

Output:@partNum productName quantity USPrice shipDate

872-AA Lawnmower 1 149.99 2014-11-20

945-ZG Sapphire Bracelet 2 178.99 <null>

2 record(s) selectedRequire

PI39003

VALUE

{@partNum:"872-AA",productName:"Lawnmower",quantity:1,USPrice:149.990000,shipDate:"2014-11-20"}

@partNum:"945-ZG",productName:"Sapphire Bracelet",quantity:2,USPrice:178.990000,comment:"Not shipped"}

Page 26: JSON Support in DB2 for z/OS

Allow SQL Access

26

CREATE VIEW ITEMVIEW(partNum, productName, quantity, USPrice, shipDate) ASSELECT JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), '@partNum', 's:10'),

JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'productName', 's:20'), JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'quantity', 'i'),JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'USPrice', 'f'),JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'shipDate', 's:20')

FROM JSONPO,TABLE(SYSTOOLS.JSON_TABLE(DATA, 'PO.items.item', 's:200')) X

SELECT PRODUCTNAME, SHIPDATE FROM ITEMVIEW;

PARTNUM PRODUCTNAME QUANTITY USPRICE SHIPDATE

872-AA Lawnmower 1 149.99 2014-11-20

945-ZG Sapphire Bracelet 2 178.99 <null>

ITEMVIEW

Page 27: JSON Support in DB2 for z/OS

Parameter to Table

27

CREATE TABLE T1 (PARTNUM VARCHAR(10), PRODUCTNAME VARCHAR(20), QUANTITY INT, USPRICE DECFLOAT, SHIPDATE VARCHAR(20));

PARTNUM PRODUCTNAME QUANTITY USPRICE SHIPDATE

872-AA Lawnmower 1 149.99 2014-11-20

945-ZG Sapphire Bracelet 2 178.99 <null>

T1

'{"PO":{"@id": 101,

"@orderDate": "2014-11-18",

"customer": {"@cid": 999},

"items": {

"item": [{"@partNum": "872-AA",

"productName": "Lawnmower",

"quantity": 1,

"USPrice": 149.99,

"shipDate": "2014-11-20"

},

{"@partNum": "945-ZG",

"productName": "Sapphire Bracelet",

"quantity": 2,

"USPrice": 178.99,

"comment": "Not shipped"

}

] …

INSERT INTO T1 SELECT JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), '@partNum', 's:10'),

JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'productName', 's:20') ,JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'quantity', 'i'),JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'USPrice', 'f') ,JSON_VAL(SYSTOOLS.JSON2BSON(X.VALUE), 'shipDate', 's:20')

FROM TABLE(SYSTOOLS.JSON_TABLE(

SYSTOOLS.JSON2BSON(?), 'PO.items.item', 's:200')) X

Page 28: JSON Support in DB2 for z/OS

28

Enabling JSON Support - How to get it?

SQL APIs only

• Available in Version 10 December 2013• Enable JSON JAVA APIs support in DB2 V10 with:

• Server-side built-in functionality for storing and indexing JSON documents (DB2 INFO APAR II14727, Enabling APAR PM98357 )

• Server-side UDFs for JSON document access (DB2 Accessories Suite for z/OS V3.1)

• Client-side API and wire listener for use of community drivers – from any DB2 10.5 LUW delivery at Fixpack 2 or higher (Recommend Recent DB2 JDBC Driver)

• Available in Version 11 June 2014• Enable JSON support(both JAVA & SQL APIs) in DB2 V11 with:

• Server-side built-in functionality for storing and indexing JSON documents (DB2 Pre-conditioning APAR PI05250, Enabling APAR PI10521 )

• Server-side UDFs for JSON document access (DB2 Accessories Suite for z/OS V3.2)

• Client-side API and wire listener for use of community drivers – from any DB2 10.5 LUW delivery at Fixpack 3 or higher (Recommend Recent DB2 JDBC Driver)

28

Page 29: JSON Support in DB2 for z/OS

29

DB2 JSON on z/OS – some assembly required. . .

JSON Java API

DB2 Engine JSON_VALJSON UDFs

JSON Catalog

JSON Wire Listener

BSON Wire

Protocol

PHPProgram

PythonProgram

Node.jsProgram

Driver

Driver

Driver

. . .

JDBC Driver

DB2 11 z/OS APAR

From any DB2 LUW 10.5 FP3

delivery

From DB2 Accessories Suite 3.2

From Open Source Download

{

SQL APIs only31

Page 30: JSON Support in DB2 for z/OS

JSON and XML

30

Page 31: JSON Support in DB2 for z/OS

XML – eXtensible Markup Language

<book>

<authors>

<author id=“47”>JohnDoe</author>

<author id=“58”>Peter Pan</author>

</authors>

<title>Database systems</title>

<price>29</price>

<keywords>

<keyword>SQL</keyword>

<keyword>relational</keyword>

</keywords>

</book>

Start Tag

Data

End Tag

Element

Attribute

XML: Describes data

HTML: Describes display

End Tag

Start Tag

What common features of XML

are missing here?

31

Page 32: JSON Support in DB2 for z/OS

32

Who Uses XML Today?

Banking

IFX, OFX, SWIFT, SPARCS,

MISMO +++

Financial Markets

FIX Protocol, FIXML, MDDL,

RIXML, FpML +++

Insurance

ACORD

XML for P&C, Life +++

Chemical & Petroleum

Chemical eStandards

CyberSecurity

PDX Standard+++

Healthcare

HL7, DICOM, SNOMED,

LOINC, SCRIPT +++

Life Sciences

MIAME, MAGE,

LSID, HL7, DICOM,

CDIS, LAB, ADaM +++

Retail

IXRetail, UCCNET, EAN-UCC

ePC Network +++

Electronics

PIPs, RNIF, Business Directory,

Open Access Standards +++

Automotive

ebXML,

other B2B Stds.

Telecommunications

eTOM, NGOSS, etc.

Parlay Specification +++

Energy & Utilities

IEC Working Group 14

Multiple Standards

CIM, MultispeakCross Industry

PDES/STEPml

SMPI Standards

RFID, DOD XML+++SEPA

34

Page 33: JSON Support in DB2 for z/OS

33

Multi-versioning Scheme (V10 NFM UTS)

Base Table

XMLColDOCID …

B+tree

DocID index

Internal XML Table

B+tree

NodeID index

B+tree

XML index (user)

XMLDATADOCID MIN_NODEID(DB2_GENERATED_DOCID_FOR_XML)

Current veion only(DOCID, NODEID, ET ↘, ST ↘)

ST: START_TS

ET: END_TS

(8 bytes)

V# update timestamp

(LRSN/RBA) (14 bytes)Add two columns

1

2

3

1

2

2

3

02

02

0208

02

35

Page 34: JSON Support in DB2 for z/OS

34

What you can do with XML in DB2 for z/OS?• Create XML column, XML index• Utilities Support: LOAD, UNLOAD, CHECK DATA, REORG, etc.• INSERT, SELECT, UPDATE• XML schema validation, transformation• SQL/XML functions

an XML document (V10)Functions Descriptions

XMLQUERY executes an XQuery and returns the result sequence. (i.e., extract data)

XMLEXISTS determines if an XQuery returns a result, a sequence of one or more items (i.e., filters data)

XMLTABLE executes an XQuery, returns the result sequence as arelational table (if possible)

XMLCAST cast to or from an XML type

XMLPARSE Parses character/BLOB data, produces XML value

DSN_XMLVALIDATE validates XML value against an XML schema

XMLMODIFY update part of an XML document (V10)

…..

Page 35: JSON Support in DB2 for z/OS

Create tables to store XML and JSON, create indexes

XMLCREATE TABLE XMLT1 (ID INT, XMLPO XML) IN DB1.TS1;

CREATE TABLE XMLT2 (ID INT, XMLPO XML(XMLSCHEMA ID

SYSXSR.PO1)) IN DB1.TS1;

create index custidx1 on XMLT1(XMLPO)

generate key using

xmlpattern '/PO/customer/@cid' as sql decfloat

JSON – JAVA APInosql>db.createCollection("JSONPO", {_id: "$oid"})

Collection: TEST."JSONPO" created. Use db.JSONPO.

nosql>db.JSONPO.ensureIndex({"PO.customer.@cid":[1,

"$int"]}, "myJSONIndex")

Create table with XML col

associated with an XML

schema

Create index on /PO/customer/@

cid

JSON - SQL APIsCREATE TABLE JSONPO( ID VARBIN(12) NOT NULL,

DATA BLOB(16M) INLINE LENGTH 25000,

PRIMARY KEY(ID)) CCSID UNICODE

CREATE INDEX IX1 ON JSONPO(

JSON_VAL(DATA, 'PO.customer.@cid','i:na'))

Create index on PO.customer.@

cid 35

Page 36: JSON Support in DB2 for z/OS

Insert

XMLINSERT INTO XMLT1 values(1,

'<PO id="123" orderDate="2013-11-18">

<customer cid="999"/>

<items>

……

</items>

</PO>')

JSON – JAVA APInosql>db.JSONPO.insert(

{

"PO": {

"@id": 123,

"@orderDate": "2013-11-18",

"customer": { "@cid": 999 },

"items": {

…….

]

}

}

})

JSON – SQL API (V11 only)

INSERT INTO JSONPO(data) VALUES

(SYSTOOLS.JSON2BSON

(‘{ “PO”:{…} } ’))

JSON data is

converted to

BSON before

sending to DB2

XML parsing

and validation is

eligible for

offload to zIIP

36

Page 37: JSON Support in DB2 for z/OS

Query – find productName for cid 999XMLSELECT XMLQuery('/PO/items/item/productName' PASSING XMLPO)

FROM XMLT1

WHERE XMLEXISTS('/PO/customer[@cid=999]' PASSING XMLPO)

JSON – JAVA APInosql>db.JSONPO.find({"PO.customer.@cid": 999}, {_id:0,

"PO.items.item.productName":1})

From trace:

SELECT CAST(SYSTOOLS.JSON_BINARY2(DATA,

'PO.items.item.productName', 2048) AS VARCHAR(2048) FOR BIT

DATA) AS "xPO_items_item_productName" FROM TEST."JSONPO"

WHERE (JSON_VAL(DATA, 'PO.customer.@cid', 'f:na')=?)

JSON – SQL API

SELECT JSON_VAL(DATA, 'PO.items.item.productName', 's:10')

FROM JSONPO

WHERE JSON_VAL(DATA,'PO.customer.@cid', 'i:na') = 999

37

Page 38: JSON Support in DB2 for z/OS

Update – replace valueXML-- replace the USPrice of SKII daily lotion

UPDATE XMLT1 SET XMLPO =

XMLModify('replace value of node

/PO/items/item[productName="SKII daily lotion"]/USPrice

with xs:decimal(200)')

WHERE XMLEXISTS('/PO[items/item/productName="SKII daily lotion"

and customer/@cid=111]'

PASSING XMLPO)

JSON – JAVA APInosql>db.JSONPO.update(

{"PO.customer.@cid": 111,

"PO.items.item.productName":"SKII daily lotion"},

{ $set:{"PO.items.item.$.USPrice": 200}})

JSON – SQL APIUPDATE JSONPO

SET DATA = SYSTOOLS.JSON2BSON(‘{ …. }')

WHERE JSON_VAL(DATA, ‘PO.customer.@cid', 'i:na') = 111

AND JSON_VAL(DATA, ‘PO.items.item.productName', ‘s:na') ="SKII

daily lotion”

Whole document

update

Whole document

update

Sub-document

update

38

Page 39: JSON Support in DB2 for z/OS

Delete – delete the document for cid 111

XMLDELETE FROM XMLT1

WHERE XMLEXISTS('/PO/customer[@cid=111]'

PASSING XMLPO)

JSON – JAVA APInosql> db.JSONPO.remove({"PO.customer.@cid": 111})

JSON – SQL API

DELETE JSONPO

WHERE JSON_VAL(DATA, ‘PO.Customer.@cid', 'i:na') = 111

39

Page 40: JSON Support in DB2 for z/OS

System B

JSON

XML

Both XML and JSON:

-Make schema evolution

simple in the database

-Coexist with relational data

JSON is used with human interfaces and mobile

applications and more making it straight-forward to pass

data structures back and forth

XML is typically used for data exchange or

shred between multiple parties, systems or

institutions providing the ability for 3rd parties

to define portions of data structures

independently – e.g., banking, insurance

System A

JSON:

1) Easy to work with

2) Smaller in size

3) Suffices for most applications

XML and JSON : Choosing between the Two

40

Page 41: JSON Support in DB2 for z/OS

Summary

• JSON and DB2 – Complementary Technologies

• DB2 JSON Technology• JAVA APIs

• SQL APIs (recommended)

• JSON and XML

41

Page 42: JSON Support in DB2 for z/OS

Read DB2 JSON Tech Article Series • Introduction to DB2 JSON

ibm.co/15ImEke• Command line processor

ibm.co/GYfi3e• Writing apps with Java API

ibm.co/19RWv5Y• JSON Wire Listener

ibm.co/16aLEmF• XML or JSON: Guidelines for what to choose for DB2 for z/OS by Jane Man and Susan

Malaikahttp://www.ibm.com/developerworks/data/library/techarticle/dm-

1403xmljson/index.html

• Use a SQL interface to handle JSON data in DB2 11 for z/OS by Jane Man and Jae Lee

https://ibm.biz/BdEwL8

Announcement Details (z/OS)• DB2 for z/OS Accessories Suite

http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?subtype=ca&infotype=an&supplier=897&letternum=ENUS213-395

Getting more information

42

Page 43: JSON Support in DB2 for z/OS

XML Resources

• DeverloperWorks DB2 for z/OS pureXML wiki

• https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/pureXML/page/DB2%20for%20zOS%20pureXML

• One stop shopping for all things pureXML. Categories include: white papers, Webcasts and Podcasts, Presentations and Demonstration, etc.

• Join other customers and become a pureXML devotee

• Hosts periodic pureXML talks by the experts

• https://www.ibm.com/developerworks/wikis/display/db2xml/devotee

43

Page 44: JSON Support in DB2 for z/OS

44

Page 45: JSON Support in DB2 for z/OS

45

Page 46: JSON Support in DB2 for z/OS

Jane [email protected]

F5Learning Exciting JSON features in DB2 for z/OS

Please fill out your session

evaluation before leaving!