CREATE TABLE product_catalog ( ident number generated always as identity, json_document CLOB CONSTRAINT validate_json CHECK (json_document IS JSON)); INSERT INTO product_catalog (json_document) VALUES ('{ "id": 14, "name": "Table", "price": 22.95, "details": {"color" : "brown", "stock" : "yes" } }'); INSERT INTO product_catalog (json_document) VALUES ('{ "id": 22, "name": "Door", "price": 14.99, "details": {"color" : "white", "stock" : "yes" } }'); INSERT INTO product_catalog (json_document) VALUES ('{ "id": 99, "name": "Chair", "price": 5.25, "details": {"color" : "black", "stock" : "no" } }'); SET AUTOTRACE TRACE EXPLAIN /* dot notation */ SELECT ident, json.json_document.id as id, json.json_document.name as name, json.json_document.price as price FROM product_catalog json WHERE json.json_document.name = 'Chair'; /* JSON value */ SELECT ident, json.json_document.id as id, json.json_document.name as name, json.json_document.price as price FROM product_catalog json WHERE json_value(json_document, '$.name' returning varchar2 error on error) = 'Chair'; CREATE INDEX json_name ON product_catalog json (json.json_document.name); /* dot notation */ SELECT ident, json.json_document.id as id, json.json_document.name as name, json.json_document.price as price FROM product_catalog json WHERE json.json_document.name = 'Chair'; /* JSON value */ SELECT ident, json.json_document.id as id, json.json_document.name as name, json.json_document.price as price FROM product_catalog json WHERE json_value(json_document, '$.name' returning varchar2 error on error) = 'Chair'; DECLARE recins NUMBER := 0; limit NUMBER := 3334; BEGIN WHILE recins < limit LOOP INSERT INTO product_catalog (json_document) VALUES ('{ "id": 14, "name": "Table", "price": 22.95, "details": {"color" : "brown", "stock" : "yes" } }'); INSERT INTO product_catalog (json_document) VALUES ('{ "id": 22, "name": "Door", "price": 14.99, "details": {"color" : "white", "stock" : "yes" } }'); INSERT INTO product_catalog (json_document) VALUES ('{ "id": 99, "name": "Chair", "price": 5.25, "details": {"color" : "black", "stock" : "no" } }'); recins := recins + 1; END LOOP; END; / COL name FORMAT a10 COL total FORMAT 99999 SELECT json.json_document.name as name, count(*) as total FROM product_catalog json GROUP BY json.json_document.name; /* dot notation */ SELECT ident, json.json_document.id as id, json.json_document.name as name, json.json_document.price as price FROM product_catalog json WHERE json.json_document.name = 'Chair'; /* JSON value */ SELECT ident, json.json_document.id as id, json.json_document.name as name, json.json_document.price as price FROM product_catalog json WHERE json_value(json_document, '$.name' returning varchar2 error on error) = 'Chair'; -- Clean-Up DROP TABLE product_catalog PURGE;