create or replace json relational duality view departments_dv as
select json {'_id' : d.deptno,
'departmentName' : d.dname,
'location' : d.loc,
'employees' :
[ select json {'employeeNumber' : e.empno,
'employeeName' : e.ename,
'job' : e.job,
'salary' : e.sal}
from emp e with insert update delete
where d.deptno = e.deptno ]}
from dept d with insert update delete;
create or replace json relational duality view departments_dv as
dept @insert @update @delete
{
_id: deptno
departmentName : dname
location : loc
employees : emp @insert @update @delete
[{
employeeNumber : empno
employeeName : ename
job : job
salary : sal
}]
};
create or replace json relational duality view departments_dv as
dept @insert @update @delete
{
_id: deptno
departmentName : dname
location : loc
employees : emp @insert @update @delete @link (to : ["deptno"])
[{
employeeNumber : empno
employeeName : ename
job : job
salary : sal
}]
};
SQL> desc departments_dv
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
DATA JSON
SQL>
set long 1000000 pagesize 1000 linesize 100
select * from departments_dv;
DATA
--------------------------------------------------------------------------------
{"_id":10,"_metadata":{"etag":"E546E2220E8F9620E36C2A7F8858D6F7","asof":"0000000
0002F03CA"},"departmentName":"ACCOUNTING","location":"NEW YORK","employees":[{"e
mployeeNumber":7782,"employeeName":"CLARK","job":"MANAGER","salary":2450},{"empl
oyeeNumber":7839,"employeeName":"KING","job":"PRESIDENT","salary":5000},{"employ
eeNumber":7934,"employeeName":"MILLER","job":"CLERK","salary":1300}]}
{"_id":20,"_metadata":{"etag":"8DAFACC22EC949A2C54B9F7BBE79B171","asof":"0000000
0002F03CA"},"departmentName":"RESEARCH","location":"DALLAS","employees":[{"emplo
yeeNumber":7369,"employeeName":"SMITH","job":"CLERK","salary":800},{"employeeNum
ber":7566,"employeeName":"JONES","job":"MANAGER","salary":2975},{"employeeNumber
":7788,"employeeName":"SCOTT","job":"ANALYST","salary":3000},{"employeeNumber":7
876,"employeeName":"ADAMS","job":"CLERK","salary":1100},{"employeeNumber":7902,"
employeeName":"FORD","job":"ANALYST","salary":3000}]}
{"_id":30,"_metadata":{"etag":"72D95F921FBC3FFC59C269B80EFBA5CF","asof":"0000000
0002F03CA"},"departmentName":"SALES","location":"CHICAGO","employees":[{"employe
eNumber":7499,"employeeName":"ALLEN","job":"SALESMAN","salary":1600},{"employeeN
umber":7521,"employeeName":"WARD","job":"SALESMAN","salary":1250},{"employeeNumb
er":7654,"employeeName":"MARTIN","job":"SALESMAN","salary":1250},{"employeeNumbe
r":7698,"employeeName":"BLAKE","job":"MANAGER","salary":2850},{"employeeNumber":
7844,"employeeName":"TURNER","job":"SALESMAN","salary":1500},{"employeeNumber":7
900,"employeeName":"JAMES","job":"CLERK","salary":950}]}
{"_id":40,"_metadata":{"etag":"6FAB9798FF405D87F0EB44456398A5D5","asof":"0000000
0002F03CA"},"departmentName":"OPERATIONS","location":"BOSTON","employees":[]}
SQL>
select json_serialize(d.data pretty) from departments_dv d;
JSON_SERIALIZE(D.DATAPRETTY)
----------------------------------------------------------------------------------------------------
{
"_id" : 10,
"_metadata" :
{
"etag" : "E546E2220E8F9620E36C2A7F8858D6F7",
"asof" : "00000000002F03D5"
},
"departmentName" : "ACCOUNTING",
"location" : "NEW YORK",
"employees" :
[
{
"employeeNumber" : 7782,
"employeeName" : "CLARK",
"job" : "MANAGER",
"salary" : 2450
},
{
"employeeNumber" : 7839,
"employeeName" : "KING",
"job" : "PRESIDENT",
"salary" : 5000
},
{
"employeeNumber" : 7934,
"employeeName" : "MILLER",
"job" : "CLERK",
"salary" : 1300
}
]
}
{
"_id" : 20,
"_metadata" :
{
"etag" : "8DAFACC22EC949A2C54B9F7BBE79B171",
"asof" : "00000000002F03D5"
},
"departmentName" : "RESEARCH",
"location" : "DALLAS",
"employees" :
[
{
"employeeNumber" : 7369,
"employeeName" : "SMITH",
"job" : "CLERK",
"salary" : 800
},
{
"employeeNumber" : 7566,
"employeeName" : "JONES",
"job" : "MANAGER",
"salary" : 2975
},
{
"employeeNumber" : 7788,
"employeeName" : "SCOTT",
"job" : "ANALYST",
"salary" : 3000
},
{
"employeeNumber" : 7876,
"employeeName" : "ADAMS",
"job" : "CLERK",
"salary" : 1100
},
{
"employeeNumber" : 7902,
"employeeName" : "FORD",
"job" : "ANALYST",
"salary" : 3000
}
]
}
{
"_id" : 30,
"_metadata" :
{
"etag" : "72D95F921FBC3FFC59C269B80EFBA5CF",
"asof" : "00000000002F03D5"
},
"departmentName" : "SALES",
"location" : "CHICAGO",
"employees" :
[
{
"employeeNumber" : 7499,
"employeeName" : "ALLEN",
"job" : "SALESMAN",
"salary" : 1600
},
{
"employeeNumber" : 7521,
"employeeName" : "WARD",
"job" : "SALESMAN",
"salary" : 1250
},
{
"employeeNumber" : 7654,
"employeeName" : "MARTIN",
"job" : "SALESMAN",
"salary" : 1250
},
{
"employeeNumber" : 7698,
"employeeName" : "BLAKE",
"job" : "MANAGER",
"salary" : 2850
},
{
"employeeNumber" : 7844,
"employeeName" : "TURNER",
"job" : "SALESMAN",
"salary" : 1500
},
{
"employeeNumber" : 7900,
"employeeName" : "JAMES",
"job" : "CLERK",
"salary" : 950
}
]
}
{
"_id" : 40,
"_metadata" :
{
"etag" : "6FAB9798FF405D87F0EB44456398A5D5",
"asof" : "00000000002F03D5"
},
"departmentName" : "OPERATIONS",
"location" : "BOSTON",
"employees" :
[
]
}
SQL>
-- SQL syntax.
create or replace json relational duality view departments_dv as
select json {'_id' : d.deptno,
'departmentName' : d.dname,
'location' : d.loc,
'employees' :
[ select json {'employeeNumber' : e.empno,
'employeeName' : e.ename,
'job' : e.job,
'salary' : e.sal}
from emp e with nocheck
where d.deptno = e.deptno ]}
from dept d with insert update delete;
-- GraphQL syntax.
create or replace json relational duality view departments_dv as
dept @insert @update @delete
{
_id: deptno
departmentName : dname
location : loc
employees : emp @nocheck
[{
employeeNumber : empno
employeeName : ename
job : job
salary : sal
}]
};
column departmentname format A20
column location format A20
select d.data.departmentName,
d.data.location
from departments_dv d
where d.data."_id"= 40;
DEPARTMENTNAME LOCATION
-------------------- --------------------
"OPERATIONS" "BOSTON"
SQL>
select json_serialize(d.data pretty)
from departments_dv d
where d.data."_id" = 40;
JSON_SERIALIZE(D.DATAPRETTY)
----------------------------------------------------------------------------------------------------
{
"_id" : 40,
"_metadata" :
{
"etag" : "6FAB9798FF405D87F0EB44456398A5D5",
"asof" : "00000000002F2799"
},
"departmentName" : "OPERATIONS",
"location" : "BOSTON",
"employees" :
[
]
}
SQL>
-- SQL syntax.
create or replace json relational duality view employee_dv as
select json {'_id' : e.empno,
'employeeName' : e.ename,
'job' : e.job,
'salary' : e.sal,
unnest (select json {'departmentNumber' : d.deptno,
'departmentName' : d.dname,
'location' : d.loc}
from dept d with update
where d.deptno = e.deptno)}
from emp e with insert update delete;
-- GraphQL syntax.
create or replace json relational duality view employee_dv as
emp @insert @update @delete
{
_id : empno
employeeName : ename
job : job
salary : sal
dept @unnest @update
{
departmentNumber : deptno
departmentName : dname
location : loc
}
};
set long 1000000 pagesize 1000 linesize 100
select json_serialize(d.data pretty) from employee_dv d;
JSON_SERIALIZE(D.DATAPRETTY)
----------------------------------------------------------------------------------------------------
{
"_id" : 7369,
"_metadata" :
{
"etag" : "A63777A126E5F53961E8C4A16C266EBB",
"asof" : "00000000002F2825"
},
"employeeName" : "SMITH",
"job" : "CLERK",
"salary" : 800,
"departmentNumber" : 20,
"departmentName" : "RESEARCH",
"location" : "DALLAS"
}
{
"_id" : 7499,
"_metadata" :
{
"etag" : "9D9E402CAF3D10EF54D4247D73823D3F",
"asof" : "00000000002F2825"
},
"employeeName" : "ALLEN",
"job" : "SALESMAN",
"salary" : 1600,
"departmentNumber" : 30,
"departmentName" : "SALES",
"location" : "CHICAGO"
}
{
"_id" : 7521,
"_metadata" :
{
"etag" : "74F4CD7F3B259FEA3FC0DDCCFB1401C8",
"asof" : "00000000002F2825"
},
"employeeName" : "WARD",
"job" : "SALESMAN",
"salary" : 1250,
"departmentNumber" : 30,
"departmentName" : "SALES",
"location" : "CHICAGO"
}
{
"_id" : 7566,
"_metadata" :
{
"etag" : "08D7586DDDDA8815C79F7699B27855D0",
"asof" : "00000000002F2825"
},
"employeeName" : "JONES",
"job" : "MANAGER",
"salary" : 2975,
"departmentNumber" : 20,
"departmentName" : "RESEARCH",
"location" : "DALLAS"
}
{
"_id" : 7654,
"_metadata" :
{
"etag" : "F5CD155921D861857FD235AE2BA33B32",
"asof" : "00000000002F2825"
},
"employeeName" : "MARTIN",
"job" : "SALESMAN",
"salary" : 1250,
"departmentNumber" : 30,
"departmentName" : "SALES",
"location" : "CHICAGO"
}
{
"_id" : 7698,
"_metadata" :
{
"etag" : "D3BBEE8D354F8D8196A341DD4D6BD5A0",
"asof" : "00000000002F2825"
},
"employeeName" : "BLAKE",
"job" : "MANAGER",
"salary" : 2850,
"departmentNumber" : 30,
"departmentName" : "SALES",
"location" : "CHICAGO"
}
{
"_id" : 7782,
"_metadata" :
{
"etag" : "54B65297EE2FDD71C2446AF340EF5FEB",
"asof" : "00000000002F2825"
},
"employeeName" : "CLARK",
"job" : "MANAGER",
"salary" : 2450,
"departmentNumber" : 10,
"departmentName" : "ACCOUNTING",
"location" : "NEW YORK"
}
{
"_id" : 7788,
"_metadata" :
{
"etag" : "0F8E38BC4010500A69BB7DEB60A866B2",
"asof" : "00000000002F2825"
},
"employeeName" : "SCOTT",
"job" : "ANALYST",
"salary" : 3000,
"departmentNumber" : 20,
"departmentName" : "RESEARCH",
"location" : "DALLAS"
}
{
"_id" : 7839,
"_metadata" :
{
"etag" : "0843EAB8EC26FA3750DFA257EE4CD226",
"asof" : "00000000002F2825"
},
"employeeName" : "KING",
"job" : "PRESIDENT",
"salary" : 5000,
"departmentNumber" : 10,
"departmentName" : "ACCOUNTING",
"location" : "NEW YORK"
}
{
"_id" : 7844,
"_metadata" :
{
"etag" : "9013BF2FAB19018195178852392505D0",
"asof" : "00000000002F2825"
},
"employeeName" : "TURNER",
"job" : "SALESMAN",
"salary" : 1500,
"departmentNumber" : 30,
"departmentName" : "SALES",
"location" : "CHICAGO"
}
{
"_id" : 7876,
"_metadata" :
{
"etag" : "6644297DF23A67BB8B64E58684BB3AE6",
"asof" : "00000000002F2825"
},
"employeeName" : "ADAMS",
"job" : "CLERK",
"salary" : 1100,
"departmentNumber" : 20,
"departmentName" : "RESEARCH",
"location" : "DALLAS"
}
{
"_id" : 7900,
"_metadata" :
{
"etag" : "608D2FE0707077C3CBCBC0433E5EC4A6",
"asof" : "00000000002F2825"
},
"employeeName" : "JAMES",
"job" : "CLERK",
"salary" : 950,
"departmentNumber" : 30,
"departmentName" : "SALES",
"location" : "CHICAGO"
}
{
"_id" : 7902,
"_metadata" :
{
"etag" : "DE4B194E2B4D20E581D5EBADAA05EA2A",
"asof" : "00000000002F2825"
},
"employeeName" : "FORD",
"job" : "ANALYST",
"salary" : 3000,
"departmentNumber" : 20,
"departmentName" : "RESEARCH",
"location" : "DALLAS"
}
{
"_id" : 7934,
"_metadata" :
{
"etag" : "7B4F094D40AB63A8C87DF841D3C9870B",
"asof" : "00000000002F2825"
},
"employeeName" : "MILLER",
"job" : "CLERK",
"salary" : 1300,
"departmentNumber" : 10,
"departmentName" : "ACCOUNTING",
"location" : "NEW YORK"
}
14 rows selected.
SQL>
create or replace json relational duality view departments_dv as
dept
{
_id: deptno,
departmentName : dname
location : loc
employeeSalaries @generated(path: "$.employees.salary.sum()")
employees : emp
[{
employeeNumber : empno
employeeName : ename
job : job
salary : sal
}]
};
column "_id" format a10
column "departmentName" format a20
column "employeeSalaries" format a20
select d.data."_id",
d.data."departmentName",
d.data."employeeSalaries"
from departments_dv d
order by 1;
_id departmentName employeeSalaries
---------- -------------------- --------------------
10 "ACCOUNTING" 8750
20 "RESEARCH" 10875
30 "SALES" 9400
40 "OPERATIONS"
SQL>
create or replace json relational duality view departments_dv as
dept @insert @update @delete
{
_id: deptno
departmentName : dname
location : loc
employees : emp @insert @update @delete
[{
employeeNumber : empno
employeeName : ename
job : job
salary : sal
}]
};