drop table plan_table
drop materialized view fast_mv
drop materialized view mat_v1
drop table zoo
create table PLAN_TABLE (
statement_id varchar2(30),
plan_id number,
timestamp date,
remarks varchar2(4000),
operation varchar2(30),
options varchar2(255),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_alias varchar2(65),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id numeric,
depth numeric,
position numeric,
cost numeric,
cardinality numeric,
bytes numeric,
other_tag varchar2(255),
partition_start varchar2(255),
partition_stop varchar2(255),
partition_id numeric,
other long,
distribution varchar2(30),
cpu_cost numeric,
io_cost numeric,
temp_space numeric,
access_predicates varchar2(4000),
filter_predicates varchar2(4000),
projection varchar2(4000),
time numeric,
qblock_name varchar2(30),
other_xml clob
)
create table zoo (id number primary key, jcol varchar2(4000) check (jcol is json))
insert into zoo values (1, '{"name":"Flipper", "species":"dolphin", "food":"fish"}')
insert into zoo values (2, '{"name":"Lassie", "species":"dog", "food":"Friskies"}')
insert into zoo values (3, '{"name":"Findus", "species":"cat", "food":["Meow","Mix"]}')
insert into zoo values (4, '{"name":"Melman", "species":"giraffe", "height": 4}')
insert into zoo values (5, '{"name":"Leo","species":"Lion","food":["Giraffes", "Meow Mix"]}')
select id, jt.*
from zoo,
JSON_TABLE(jcol, '$'
columns ("name",
"species",
NESTED PATH '$.food[*]'
columns("food" path '$'))) jt
select id, jt.*
from zoo,
JSON_TABLE(jcol, '$'
columns ("name" VARCHAR2(32) path '$.name',
"species" VARCHAR2(20) path '$.species',
NESTED PATH '$.food[*]'
columns("food" VARCHAR2(20) path '$'))) jt
create materialized view mat_v1 as
select id, jt.*
from zoo,
JSON_TABLE(jcol, '$'
columns ("name" VARCHAR2(32) path '$.name',
"species" VARCHAR2(20) path '$.species',
NESTED PATH '$.food[*]'
columns("food" VARCHAR2(20) path '$'))) jt
select "name" from mat_v1 where "food" = 'Meow Mix'
EXPLAIN PLAN SET STATEMENT_ID = 'jsonPlan' FOR
select "name" from mat_v1 where "food" = 'Meow Mix'
SELECT LPAD('............................',2*(LEVEL-1))||operation operation, options, object_name, position
FROM plan_table
START WITH id = 0 AND statement_id = 'jsonPlan'
CONNECT BY PRIOR id = parent_id AND statement_id = 'jsonPlan'
create index mat_view_food_idx on mat_v1("food")
delete from plan_table
EXPLAIN PLAN SET STATEMENT_ID = 'jsonPlan' FOR
select "name" from mat_v1 where "food" = 'Meow Mix'
SELECT LPAD('............................',2*(LEVEL-1))||operation operation, options, object_name, position
FROM plan_table
START WITH id = 0 AND statement_id = 'jsonPlan'
CONNECT BY PRIOR id = parent_id AND statement_id = 'jsonPlan'
insert into zoo values (6, '{"name":"Laika","species":"Space dog","food":"dehydrated meat"}')
commit
select "name" from mat_v1
exec DBMS_MVIEW.REFRESH('MAT_V1', 'C', '', TRUE, FALSE, 0,0,0, FALSE, FALSE)
select "name" from mat_v1
drop materialized view mat_v1
create materialized view log on zoo
create materialized view fast_mv
build immediate
refresh fast
on commit
as
select id, jt.*
from zoo,
JSON_TABLE(jcol, '$'
columns ("name" VARCHAR2(32) path '$.name',
"species" VARCHAR2(20) path '$.species',
NESTED PATH '$.food[*]'
columns("food" VARCHAR2(20) path '$'))) jt
create index fast_mv_food_idx on fast_mv("food")
select "name" from fast_mv where "food" = 'roots'
insert into zoo values (7,
'{"name":"Dumbo", "species":"Elephant", "food":["roots", "tree bark"],
"descr":"An elephant has a long nose that serves as straw. Current bans on plastic straws will most likely not apply."}')
commit
select "name" from fast_mv where "food" = 'roots'
delete from plan_table
EXPLAIN PLAN SET STATEMENT_ID = 'jsonPlan' FOR
select "name" from fast_mv where "food" = 'roots'
SELECT LPAD('............................',2*(LEVEL-1))||operation operation, options, object_name, position
FROM plan_table
START WITH id = 0 AND statement_id = 'jsonPlan'
CONNECT BY PRIOR id = parent_id AND statement_id = 'jsonPlan'
update zoo set jcol =
JSON_MERGEPATCH(jcol, '{"food":"Acacia"}')
where id = 4
commit
select "name" from fast_mv where "food" = 'Acacia'