Create JSON Table
CREATE TABLE json_data
( unique_id NUMBER,
json_col CLOB
CONSTRAINT must_be_json
CHECK ( json_col IS JSON ) )
Table created.
Create JSON Row 1
INSERT INTO json_data
VALUES(1,
'{"Name" : "Marty",
"Reason" : [ { "Medium" : "Movie",
"Title" : "Madagascar",
"Year" : 2005 },
{ "Medium" : "Movie",
"Title" : "Madagascar Escape 2 Africa",
"Year" : 2008 },
{ "Medium" : "Movie",
"Title" : "Madagascar 3 : Europes Most Wanted",
"Year" : 2012 } ] }')
1 row(s) inserted.
Create Another Row Of Data
INSERT INTO json_data
VALUES(2,
'{"Name" : "Zigby",
"Reason" : [ { "Medium" : "Book",
"Title" : "Zigby Camps Out",
"Year" : 2002 },
{ "Medium" : "Book",
"Title" : "Zigby Hunts For Treasure",
"Year" : 2002 },
{ "Medium" : "Book",
"Title" : "Zigby and the Ant Invaders",
"Year" : 2003 } ] }')
1 row(s) inserted.
Create Name View
CREATE OR REPLACE VIEW names AS
SELECT unique_id,
JSON_VALUE(jd.json_col,'$.Name') name
FROM json_data jd
View created.
Query The View
SELECT unique_id,
name
FROM names
| UNIQUE_ID | NAME | 1 | Marty | 2 | Zigby |
|---|
Attempt To Update The View
UPDATE names
SET name = 'Bob'
WHERE unique_id = 1
ORA-01733: virtual column not allowed hereMore Details: https://docs.oracle.com/error-help/db/ora-01733
Instead Of Trigger
CREATE OR REPLACE TRIGGER instead_of_for_names
INSTEAD OF UPDATE ON names
DECLARE
v_json CLOB;
v_zebra_t JSON_OBJECT_T;
BEGIN
-- Query the JSON column from the table
SELECT json_col
INTO v_json
FROM json_data
WHERE unique_id = :OLD.unique_id;
-- Parse the JSON and put the new Name value in place
v_zebra_t := JSON_OBJECT_T.PARSE(v_json);
v_zebra_t.PUT('Name',:NEW.Name);
-- Set v_json
v_json := v_zebra_t.TO_STRING;
-- Update the table
UPDATE json_data
SET json_col = v_json
WHERE unique_id = :OLD.unique_id;
END;
Trigger created.
Update Succeeds
UPDATE names
SET name = 'Bob'
WHERE unique_id = 1
1 row(s) updated.
Verify Update
SELECT name
FROM names
| NAME | Bob | Zigby |
|---|