{"id":13430,"date":"2024-06-27T13:31:12","date_gmt":"2024-06-27T11:31:12","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=13430"},"modified":"2024-07-02T00:12:57","modified_gmt":"2024-07-01T22:12:57","slug":"islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/","title":{"rendered":"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>In the <a href=\"https:\/\/www.salvis.com\/blog\/2024\/06\/15\/islandsql-episode-8-whats-new-in-oracle-database-23-4\/\">last episode<\/a>, we looked at some new features in Oracle Database 23.4. The <a href=\"https:\/\/github.com\/IslandSQL\/IslandSQL\">IslandSQL<\/a> grammar now covers all statements that can contain static DML statements and code in PL\/SQL and PL\/pgSQL. <\/p>\n\n\n\n<p>While implementing the ANTLR grammar for the <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/create-json-relational-duality-view.html\">create JSON relational duality view<\/a> statement I stumbled over GraphQL in this syntax diagram:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/image.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"469\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/image-1024x469.png\" alt=\"create_json_relational_duality_view railroad diagram\" class=\"wp-image-13431\" style=\"width:541px\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/image-1024x469.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/image-300x138.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/image-768x352.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/image-150x69.png 150w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/image-480x220.png 480w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/image.png 1082w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>You can use <a href=\"https:\/\/graphql.org\/learn\/\">GraphQL<\/a> as an alternative to a subquery to describe the source of your JSON relational duality view. This feature was already part of 23.3. Usually, I don&#8217;t like it when there are several ways to do the same thing. However, in this case, GraphQL helped me to understand the variant of the <code>select statement<\/code> in the duality view better. GraphQL might even be better suited to describe the content of a duality view.<\/p>\n\n\n\n<p>The funny thing is that JSON is about schema flexibility and GraphQL needs a schema to work. That sounds contradictory. However, if we reduce the scope of schema flexibility to a JSON object within existing entities, this can work quite well.<\/p>\n\n\n\n<p>In this blog post, I explore some features related to the schema flexibility of JSON relational duality views.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"#setup\">Setup<\/a><\/li>\n\n\n\n<li><a href=\"#read-only-view\">Read-only View \u00e0 la 19c<\/a><\/li>\n\n\n\n<li><a href=\"#read-only-duality-view\">Read-only Duality View<\/a><\/li>\n\n\n\n<li><a href=\"#updateable-duality-view-using-select\">Updateable Duality View Using SELECT<\/a><\/li>\n\n\n\n<li><a href=\"#updateable-duality-view-using-graphql\">Updateable Duality View Using GraphQL<\/a><\/li>\n\n\n\n<li><a href=\"#graphql-vs-select\">GraphQL vs. SELECT<\/a><\/li>\n\n\n\n<li><a href=\"#insert-into-duality-view\">Insert Into Duality View<\/a><\/li>\n\n\n\n<li><a href=\"#update-duality-view\">Update Duality View<\/a><\/li>\n\n\n\n<li><a href=\"#delete-from-duality-view\">Delete From Duality View<\/a><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"setup\">1. Setup<\/h2>\n\n\n\n<p>The examples in this blog post require an Oracle Database 23.4 (yes, 23.3 is not enough). In a schema of your choice you can run the following setup script:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">1) Setup for extended dept and emp table<\/span><span role=\"button\" tabindex=\"0\" data-code=\"set linesize 200\nset pagesize 1000  \nset long 32767\ncolumn ext format a72\ncolumn data format a130\nalter session set nls_date_format = 'YYYY-MM-DD';\n\ndrop table if exists emp;\ndrop table if exists dept;\n\ncreate table dept (\n   deptno number(2, 0)      not null constraint dept_pk primary key,\n   dname  varchar2(14 char) not null,\n   loc    varchar2(13 char) not null,\n   ext    json(object)\n);\n\ncreate table emp (\n   empno    number(4, 0)      not null  constraint emp_pk primary key,\n   ename    varchar2(10 char) not null,\n   job      varchar2(9 char)  not null,\n   mgr      number(4, 0)                constraint emp_mgr_fk references emp,\n   hiredate date              not null,\n   sal      number(7, 2)      not null,\n   comm     number(7, 2),\n   deptno   number(2, 0)      not null  constraint emp_deptno_fk references dept,\n   ext      json(object)\n);\n\ninsert into dept (deptno, dname, loc)\nvalues (10, 'ACCOUNTING', 'NEW YORK'),\n       (20, 'RESEARCH',   'DALLAS'),\n       (30, 'SALES',      'CHICAGO'),\n       (40, 'OPERATIONS', 'BOSTON');\ncommit;\n       \ninsert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)\nvalues (7566, 'JONES',  'MANAGER',   7839, date '1981-04-02', 2975, null, 20),\n       (7698, 'BLAKE',  'MANAGER',   7839, date '1981-05-01', 2850, null, 30),\n       (7782, 'CLARK',  'MANAGER',   7839, date '1981-06-09', 2450, null, 10),\n       (7788, 'SCOTT',  'ANALYST',   7566, date '1987-04-19', 3000, null, 20),\n       (7902, 'FORD',   'ANALYST',   7566, date '1981-12-03', 3000, null, 20),\n       (7499, 'ALLEN',  'SALESMAN',  7698, date '1981-02-20', 1600,  300, 30),\n       (7521, 'WARD',   'SALESMAN',  7698, date '1981-02-22', 1250,  500, 30),\n       (7654, 'MARTIN', 'SALESMAN',  7698, date '1981-09-28', 1250, 1400, 30),\n       (7844, 'TURNER', 'SALESMAN',  7698, date '1981-09-08', 1500,    0, 30),\n       (7900, 'JAMES',  'CLERK',     7698, date '1981-12-03',  950, null, 30),\n       (7934, 'MILLER', 'CLERK',     7782, date '1982-01-23', 1300, null, 10),\n       (7369, 'SMITH',  'CLERK',     7902, date '1980-12-17',  800, null, 20),\n       (7839, 'KING',   'PRESIDENT', null, date '1981-11-17', 5000, null, 10),\n       (7876, 'ADAMS',  'CLERK',     7788, date '1987-05-23', 1100, null, 20);\ncommit;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\"> linesize <\/span><span style=\"color: #B5CEA8\">200<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\"> pagesize <\/span><span style=\"color: #B5CEA8\">1000<\/span><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">long<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">32767<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">column<\/span><span style=\"color: #D4D4D4\"> ext format a72<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">column<\/span><span style=\"color: #D4D4D4\"> data format a130<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">alter session<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\"> nls_date_format = <\/span><span style=\"color: #CE9178\">&#39;YYYY-MM-DD&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">drop<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">exists<\/span><span style=\"color: #D4D4D4\"> emp;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">drop<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">exists<\/span><span style=\"color: #D4D4D4\"> dept;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">create<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #D4D4D4\"> dept (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   deptno <\/span><span style=\"color: #569CD6\">number<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">)      <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">constraint<\/span><span style=\"color: #D4D4D4\"> dept_pk <\/span><span style=\"color: #569CD6\">primary key<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   dname  <\/span><span style=\"color: #569CD6\">varchar2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">14<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   loc    <\/span><span style=\"color: #569CD6\">varchar2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">13<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   ext    json(object)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">create<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #D4D4D4\"> emp (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   empno    <\/span><span style=\"color: #569CD6\">number<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">)      <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">constraint<\/span><span style=\"color: #D4D4D4\"> emp_pk <\/span><span style=\"color: #569CD6\">primary key<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ename    <\/span><span style=\"color: #569CD6\">varchar2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   job      <\/span><span style=\"color: #569CD6\">varchar2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\">)  <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   mgr      <\/span><span style=\"color: #569CD6\">number<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">)                <\/span><span style=\"color: #569CD6\">constraint<\/span><span style=\"color: #D4D4D4\"> emp_mgr_fk <\/span><span style=\"color: #569CD6\">references<\/span><span style=\"color: #D4D4D4\"> emp,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   hiredate <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   sal      <\/span><span style=\"color: #569CD6\">number<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">)      <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   comm     <\/span><span style=\"color: #569CD6\">number<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   deptno   <\/span><span style=\"color: #569CD6\">number<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">)      <\/span><span style=\"color: #569CD6\">not<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">constraint<\/span><span style=\"color: #D4D4D4\"> emp_deptno_fk <\/span><span style=\"color: #569CD6\">references<\/span><span style=\"color: #D4D4D4\"> dept,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   ext      json(object)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">insert<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">into<\/span><span style=\"color: #D4D4D4\"> dept (deptno, dname, loc)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">values<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;ACCOUNTING&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;NEW YORK&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;RESEARCH&#39;<\/span><span style=\"color: #D4D4D4\">,   <\/span><span style=\"color: #CE9178\">&#39;DALLAS&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SALES&#39;<\/span><span style=\"color: #D4D4D4\">,      <\/span><span style=\"color: #CE9178\">&#39;CHICAGO&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">40<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;OPERATIONS&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;BOSTON&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">commit<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">insert<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">into<\/span><span style=\"color: #D4D4D4\"> emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">values<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">7566<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;JONES&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #CE9178\">&#39;MANAGER&#39;<\/span><span style=\"color: #D4D4D4\">,   <\/span><span style=\"color: #B5CEA8\">7839<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1981-04-02&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2975<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7698<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;BLAKE&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #CE9178\">&#39;MANAGER&#39;<\/span><span style=\"color: #D4D4D4\">,   <\/span><span style=\"color: #B5CEA8\">7839<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1981-05-01&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2850<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7782<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;CLARK&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #CE9178\">&#39;MANAGER&#39;<\/span><span style=\"color: #D4D4D4\">,   <\/span><span style=\"color: #B5CEA8\">7839<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1981-06-09&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2450<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7788<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SCOTT&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #CE9178\">&#39;ANALYST&#39;<\/span><span style=\"color: #D4D4D4\">,   <\/span><span style=\"color: #B5CEA8\">7566<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1987-04-19&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">3000<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7902<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FORD&#39;<\/span><span style=\"color: #D4D4D4\">,   <\/span><span style=\"color: #CE9178\">&#39;ANALYST&#39;<\/span><span style=\"color: #D4D4D4\">,   <\/span><span style=\"color: #B5CEA8\">7566<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1981-12-03&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">3000<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7499<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;ALLEN&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #CE9178\">&#39;SALESMAN&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #B5CEA8\">7698<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1981-02-20&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1600<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #B5CEA8\">300<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7521<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;WARD&#39;<\/span><span style=\"color: #D4D4D4\">,   <\/span><span style=\"color: #CE9178\">&#39;SALESMAN&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #B5CEA8\">7698<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1981-02-22&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1250<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #B5CEA8\">500<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7654<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;MARTIN&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SALESMAN&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #B5CEA8\">7698<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1981-09-28&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1250<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1400<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7844<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TURNER&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SALESMAN&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #B5CEA8\">7698<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1981-09-08&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1500<\/span><span style=\"color: #D4D4D4\">,    <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7900<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;JAMES&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #CE9178\">&#39;CLERK&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #B5CEA8\">7698<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1981-12-03&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #B5CEA8\">950<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7934<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;MILLER&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;CLERK&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #B5CEA8\">7782<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1982-01-23&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1300<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7369<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SMITH&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #CE9178\">&#39;CLERK&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #B5CEA8\">7902<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1980-12-17&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #B5CEA8\">800<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7839<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;KING&#39;<\/span><span style=\"color: #D4D4D4\">,   <\/span><span style=\"color: #CE9178\">&#39;PRESIDENT&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1981-11-17&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">5000<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #B5CEA8\">7876<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;ADAMS&#39;<\/span><span style=\"color: #D4D4D4\">,  <\/span><span style=\"color: #CE9178\">&#39;CLERK&#39;<\/span><span style=\"color: #D4D4D4\">,     <\/span><span style=\"color: #B5CEA8\">7788<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">date<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;1987-05-23&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1100<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">commit<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"\nSession altered.\n\n\nTable EMP dropped.\n\n\nTable DEPT dropped.\n\n\nTable DEPT created.\n\n\nTable EMP created.\n\n\n4 rows inserted.\n\n\nCommit complete.\n\n\n14 rows inserted.\n\n\nCommit complete.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Session altered.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Table EMP dropped.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Table DEPT dropped.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Table DEPT created.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Table EMP created.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">4 rows inserted.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Commit complete.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">14 rows inserted.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Commit complete.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>There are a few changes to the well-known <code>dept<\/code> and <code>emp<\/code> tables I&#8217;d like to highlight:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Firstly, primary keys and foreign keys. They are required for the duality views, however, they do not need to be enabled.<\/li>\n\n\n\n<li>Secondly, both tables got an additional <code>ext<\/code> column. The data type is <code>json(object)<\/code>. Before 23.4 there was just a generic <code>json<\/code> data type. With 23.4 it&#8217;s possible to add <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/SQL-JSON-Conditions.html#GUID-99B9493D-2929-4A09-BA39-A56F8E7319DA__SECTION_AFR_B3S_KBC\">modifiers<\/a>. The modifier <code>object<\/code> is required for <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/jsnvu\/json-data-stored-json-relational-duality-views.html#GUID-8D09B4D6-2853-40ED-8E7A-A921C197D5A8\">flex columns<\/a> in duality views.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"read-only-view\">2. Read-Only View \u00e0 la 19c<\/h2>\n\n\n\n<p>Let&#8217;s step back and create a view that returns a single JSON column, as in Oracle Database 19c (to make it work in 19c you have to use for example <code>ext clob check (ext is json)<\/code> instead of <code>ext json(object)<\/code> in the tables <code>dept<\/code> and <code>emp<\/code>).<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">2) Read-only view \u00e0 la 19c<\/span><span role=\"button\" tabindex=\"0\" data-code=\"create or replace view dept_v as\nselect json_object(\n          deptno,\n          dname,\n          loc,\n          ext,\n          'sal': (select sum(sal) from emp where emp.deptno = dept.deptno)\n          absent on null\n       ) as data\n  from dept;\n\nselect * from dept_v;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">create or replace<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">view<\/span><span style=\"color: #D4D4D4\"> dept_v <\/span><span style=\"color: #569CD6\">as<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_object(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          deptno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          dname,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          loc,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ext,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #CE9178\">&#39;sal&#39;<\/span><span style=\"color: #D4D4D4\">: (<\/span><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(sal) <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> emp <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> emp.deptno = dept.deptno)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          absent <\/span><span style=\"color: #569CD6\">on<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       ) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept_v;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"View DEPT_V created.\n\n\nDATA\n--------------------------------------------------------------\n{&quot;deptno&quot;:10,&quot;dname&quot;:&quot;ACCOUNTING&quot;,&quot;loc&quot;:&quot;NEW YORK&quot;,&quot;sal&quot;:8750}\n{&quot;deptno&quot;:20,&quot;dname&quot;:&quot;RESEARCH&quot;,&quot;loc&quot;:&quot;DALLAS&quot;,&quot;sal&quot;:10875}\n{&quot;deptno&quot;:30,&quot;dname&quot;:&quot;SALES&quot;,&quot;loc&quot;:&quot;CHICAGO&quot;,&quot;sal&quot;:9400}\n{&quot;deptno&quot;:40,&quot;dname&quot;:&quot;OPERATIONS&quot;,&quot;loc&quot;:&quot;BOSTON&quot;}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">View DEPT_V created.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">DATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">--------------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{&quot;deptno&quot;:10,&quot;dname&quot;:&quot;ACCOUNTING&quot;,&quot;loc&quot;:&quot;NEW YORK&quot;,&quot;sal&quot;:8750}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{&quot;deptno&quot;:20,&quot;dname&quot;:&quot;RESEARCH&quot;,&quot;loc&quot;:&quot;DALLAS&quot;,&quot;sal&quot;:10875}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{&quot;deptno&quot;:30,&quot;dname&quot;:&quot;SALES&quot;,&quot;loc&quot;:&quot;CHICAGO&quot;,&quot;sal&quot;:9400}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{&quot;deptno&quot;:40,&quot;dname&quot;:&quot;OPERATIONS&quot;,&quot;loc&quot;:&quot;BOSTON&quot;}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"read-only-duality-view\">3. Read-Only Duality View<\/h2>\n\n\n\n<p>And now let&#8217;s try to use the previous subquery in a duality view.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">3a) Read-only duality view (ORA-40616)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"create or replace json duality view dept_dv as\nselect json_object(\n          deptno,\n          dname,\n          loc,\n          ext,\n          'sal': (select sum(sal) from emp where emp.deptno = dept.deptno)\n          absent on null\n       ) as data\n  from dept;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">create or replace<\/span><span style=\"color: #D4D4D4\"> json duality <\/span><span style=\"color: #569CD6\">view<\/span><span style=\"color: #D4D4D4\"> dept_dv <\/span><span style=\"color: #569CD6\">as<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_object(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          deptno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          dname,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          loc,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ext,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #CE9178\">&#39;sal&#39;<\/span><span style=\"color: #D4D4D4\">: (<\/span><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(sal) <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> emp <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> emp.deptno = dept.deptno)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">          absent <\/span><span style=\"color: #569CD6\">on<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       ) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"ORA-40616: Cannot create JSON Relational Duality View 'DEPT_DV': using ABSENT ON NULL in JSON_OBJECT() is not permitted.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">ORA-40616: Cannot create JSON Relational Duality View &#39;DEPT_DV&#39;: using ABSENT ON NULL in JSON_OBJECT() is not permitted.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This does not work. The <code>absent on null<\/code> clause on line 8 is not supported in a duality view. Let&#8217;s remove this line and try again.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">3b) Read-only duality view (ORA-40895)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"create or replace json duality view dept_dv as\nselect json_object(\n          deptno,\n          dname,\n          loc,\n          ext,\n          'sal': (select sum(sal) from emp where emp.deptno = dept.deptno)\n       ) as data\n  from dept;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">create or replace<\/span><span style=\"color: #D4D4D4\"> json duality <\/span><span style=\"color: #569CD6\">view<\/span><span style=\"color: #D4D4D4\"> dept_dv <\/span><span style=\"color: #569CD6\">as<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_object(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          deptno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          dname,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          loc,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ext,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #CE9178\">&#39;sal&#39;<\/span><span style=\"color: #D4D4D4\">: (<\/span><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">sum<\/span><span style=\"color: #D4D4D4\">(sal) <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> emp <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> emp.deptno = dept.deptno)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       ) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"ORA-40895: invalid SQL expression in JSON relational duality view (operators except JSON_OBJECT or JSON_ARRAYAGG not allowed)\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">ORA-40895: invalid SQL expression in JSON relational duality view (operators except JSON_OBJECT or JSON_ARRAYAGG not allowed)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This still does not work. It&#8217;s not allowed to include an aggregate as in line 7. Let&#8217;s also remove this line and try again.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">3c) Read-only duality view (ORA-40941)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"create or replace json duality view dept_dv as\nselect json_object(\n          deptno,\n          dname,\n          loc,\n          ext\n       ) as data\n  from dept;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">create or replace<\/span><span style=\"color: #D4D4D4\"> json duality <\/span><span style=\"color: #569CD6\">view<\/span><span style=\"color: #D4D4D4\"> dept_dv <\/span><span style=\"color: #569CD6\">as<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_object(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          deptno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          dname,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          loc,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ext<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">       ) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"ORA-40941: cannot specify a column name or subquery alias for JSON relational duality view\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">ORA-40941: cannot specify a column name or subquery alias for JSON relational duality view<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Argh. We cannot use the column alias <code>data<\/code> on line 7. Let&#8217;s remove the alias and try again.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">3d) Read-only duality view (ORA-42647)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"create or replace json duality view dept_dv as\nselect json_object(\n          deptno,\n          dname,\n          loc,\n          ext\n       )\n  from dept;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">create or replace<\/span><span style=\"color: #D4D4D4\"> json duality <\/span><span style=\"color: #569CD6\">view<\/span><span style=\"color: #D4D4D4\"> dept_dv <\/span><span style=\"color: #569CD6\">as<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_object(<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">          deptno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          dname,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          loc,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ext<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"ORA-42647: Missing '_id' field at the root level for JSON-relational duality view 'DEPT_DV'.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">ORA-42647: Missing &#39;_id&#39; field at the root level for JSON-relational duality view &#39;DEPT_DV&#39;.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Okay, an <code>_id<\/code> field is required to identify a document. Composite keys can be passed as a JSON array. In this case, we do not need that. We can use <code>deptno<\/code>. Let&#8217;s amend the query and try again.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">3e) Read-only duality view<\/span><span role=\"button\" tabindex=\"0\" data-code=\"create or replace json duality view dept_dv as\nselect json_object(\n          '_id': deptno,\n          dname,\n          loc,\n          ext\n       )\n  from dept;\n\nselect * from dept_dv;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">create or replace<\/span><span style=\"color: #D4D4D4\"> json duality <\/span><span style=\"color: #569CD6\">view<\/span><span style=\"color: #D4D4D4\"> dept_dv <\/span><span style=\"color: #569CD6\">as<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_object(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #CE9178\">&#39;_id&#39;<\/span><span style=\"color: #D4D4D4\">: deptno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          dname,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          loc,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          ext<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept_dv;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"Json DUALITY created.\n\n\nDATA\n----------------------------------------------------------------------------------------------------------------------------------\n{&quot;_id&quot;:10,&quot;dname&quot;:&quot;ACCOUNTING&quot;,&quot;loc&quot;:&quot;NEW YORK&quot;,&quot;_metadata&quot;:{&quot;etag&quot;:&quot;38CBB37294BEE09C6D9867B5B1871FE2&quot;,&quot;asof&quot;:&quot;000025652FBC556F&quot;}}\n{&quot;_id&quot;:20,&quot;dname&quot;:&quot;RESEARCH&quot;,&quot;loc&quot;:&quot;DALLAS&quot;,&quot;_metadata&quot;:{&quot;etag&quot;:&quot;1D1973E9B068183129F7DA59F6A9C283&quot;,&quot;asof&quot;:&quot;000025652FBC556F&quot;}}\n{&quot;_id&quot;:30,&quot;dname&quot;:&quot;SALES&quot;,&quot;loc&quot;:&quot;CHICAGO&quot;,&quot;_metadata&quot;:{&quot;etag&quot;:&quot;11CC2AE352D52FFDAE0B7A3DFC99F836&quot;,&quot;asof&quot;:&quot;000025652FBC556F&quot;}}\n{&quot;_id&quot;:40,&quot;dname&quot;:&quot;OPERATIONS&quot;,&quot;loc&quot;:&quot;BOSTON&quot;,&quot;_metadata&quot;:{&quot;etag&quot;:&quot;B33BBA9A74C046813C59BA0763AD81C9&quot;,&quot;asof&quot;:&quot;000025652FBC556F&quot;}}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Json DUALITY created.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">DATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">----------------------------------------------------------------------------------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{&quot;_id&quot;:10,&quot;dname&quot;:&quot;ACCOUNTING&quot;,&quot;loc&quot;:&quot;NEW YORK&quot;,&quot;_metadata&quot;:{&quot;etag&quot;:&quot;38CBB37294BEE09C6D9867B5B1871FE2&quot;,&quot;asof&quot;:&quot;000025652FBC556F&quot;}}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{&quot;_id&quot;:20,&quot;dname&quot;:&quot;RESEARCH&quot;,&quot;loc&quot;:&quot;DALLAS&quot;,&quot;_metadata&quot;:{&quot;etag&quot;:&quot;1D1973E9B068183129F7DA59F6A9C283&quot;,&quot;asof&quot;:&quot;000025652FBC556F&quot;}}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{&quot;_id&quot;:30,&quot;dname&quot;:&quot;SALES&quot;,&quot;loc&quot;:&quot;CHICAGO&quot;,&quot;_metadata&quot;:{&quot;etag&quot;:&quot;11CC2AE352D52FFDAE0B7A3DFC99F836&quot;,&quot;asof&quot;:&quot;000025652FBC556F&quot;}}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{&quot;_id&quot;:40,&quot;dname&quot;:&quot;OPERATIONS&quot;,&quot;loc&quot;:&quot;BOSTON&quot;,&quot;_metadata&quot;:{&quot;etag&quot;:&quot;B33BBA9A74C046813C59BA0763AD81C9&quot;,&quot;asof&quot;:&quot;000025652FBC556F&quot;}}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Finally, we have a working read-only duality view. <\/p>\n\n\n\n<p>Please note that each document contains a <code>_metadata<\/code> object. The <code>etag<\/code> field is a hash value based on all document fields by default. It can be used for optimistic locking. The <code>asof<\/code> field represents the SCN (system change number). It&#8217;s useful for read consistency, this means querying related data in subsequent queries using the <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/sqlrf\/SELECT.html#GUID-CFA006CA-6FF1-4972-821E-6996142A51C6__GUID-9CA8AB48-7DE6-4601-A798-42B2038CA3A6\">flashback_query_clause<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"updateable-duality-view-using-select\">4. Updateable Duality View Using SELECT<\/h2>\n\n\n\n<p>Let&#8217;s create an updateable duality view that represents all data in our model and uses all relationships. <\/p>\n\n\n\n<p>The highlighted lines contain clauses that work only in a duality view. In other words, the &#8220;select&#8221; part does not work as a standalone statement as in common relational views.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">4) Updateable duality view using select<\/span><span role=\"button\" tabindex=\"0\" data-code=\"create or replace json duality view dept_dv as\nselect json {\n          '_id': deptno,\n          dname,\n          loc,\n          ext as flex,\n          'emps':\n             (\n                select json_arrayagg(\n                          JSON {\n                             emp.empno,\n                             emp.ename,\n                             emp.job,\n                             unnest\n                                (\n                                   select json {\n                                             'mgr'    : mgr.empno with nocheck,\n                                             'mgrname': mgr.ename with nocheck\n                                          }\n                                     from emp mgr\n                                    where mgr.empno = emp.mgr\n                                ),\n                             emp.hiredate,\n                             emp.sal,\n                             emp.comm,\n                             ext as flex\n                          }\n                       )\n                  from emp with insert update delete\n                 where emp.deptno = dept.deptno\n             )\n       }\n  from dept with insert update delete;\n\nselect json_serialize(data returning clob pretty) as data\n  from dept_dv dv\n where dv.data.&quot;_id&quot;.numberOnly() in (20, 40);\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">create or replace<\/span><span style=\"color: #D4D4D4\"> json duality <\/span><span style=\"color: #569CD6\">view<\/span><span style=\"color: #D4D4D4\"> dept_dv <\/span><span style=\"color: #569CD6\">as<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #CE9178\">&#39;_id&#39;<\/span><span style=\"color: #D4D4D4\">: deptno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          dname,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          loc,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">          ext <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> flex,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #CE9178\">&#39;emps&#39;<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_arrayagg(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                          JSON {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                             emp.empno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                             emp.ename,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                             emp.job,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                             unnest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                   <\/span><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                                             <\/span><span style=\"color: #CE9178\">&#39;mgr&#39;<\/span><span style=\"color: #D4D4D4\">    : mgr.empno <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\"> nocheck,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                                             <\/span><span style=\"color: #CE9178\">&#39;mgrname&#39;<\/span><span style=\"color: #D4D4D4\">: mgr.ename <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\"> nocheck<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                          }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                     <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> emp mgr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                    <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> mgr.empno = emp.mgr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                             emp.hiredate,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                             emp.sal,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                             emp.comm,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                             ext <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> flex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                          }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                       )<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> emp <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">insert<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">update<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">delete<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> emp.deptno = dept.deptno<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept <\/span><span style=\"color: #569CD6\">with<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">insert<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">update<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">delete<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_serialize(data <\/span><span style=\"color: #569CD6\">returning<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">clob<\/span><span style=\"color: #D4D4D4\"> pretty) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept_dv dv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> dv.data.<\/span><span style=\"color: #CE9178\">&quot;_id&quot;<\/span><span style=\"color: #D4D4D4\">.numberOnly() <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">40<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"Json DUALITY created.\n\n\nDATA\n------------------------------------------------\n{\n  &quot;_id&quot; : 20,\n  &quot;_metadata&quot; :\n  {\n    &quot;etag&quot; : &quot;88A4A9648C2CA1752E477545DCA85FD3&quot;,\n    &quot;asof&quot; : &quot;00002565300350E5&quot;\n  },\n  &quot;dname&quot; : &quot;RESEARCH&quot;,\n  &quot;loc&quot; : &quot;DALLAS&quot;,\n  &quot;emps&quot; :\n  [\n    {\n      &quot;empno&quot; : 7369,\n      &quot;ename&quot; : &quot;SMITH&quot;,\n      &quot;job&quot; : &quot;CLERK&quot;,\n      &quot;mgr&quot; : 7902,\n      &quot;mgrname&quot; : &quot;FORD&quot;,\n      &quot;hiredate&quot; : &quot;1980-12-17T00:00:00&quot;,\n      &quot;sal&quot; : 800,\n      &quot;comm&quot; : null\n    },\n    {\n      &quot;empno&quot; : 7566,\n      &quot;ename&quot; : &quot;JONES&quot;,\n      &quot;job&quot; : &quot;MANAGER&quot;,\n      &quot;mgr&quot; : 7839,\n      &quot;mgrname&quot; : &quot;KING&quot;,\n      &quot;hiredate&quot; : &quot;1981-04-02T00:00:00&quot;,\n      &quot;sal&quot; : 2975,\n      &quot;comm&quot; : null\n    },\n    {\n      &quot;empno&quot; : 7788,\n      &quot;ename&quot; : &quot;SCOTT&quot;,\n      &quot;job&quot; : &quot;ANALYST&quot;,\n      &quot;mgr&quot; : 7566,\n      &quot;mgrname&quot; : &quot;JONES&quot;,\n      &quot;hiredate&quot; : &quot;1987-04-19T00:00:00&quot;,\n      &quot;sal&quot; : 3000,\n      &quot;comm&quot; : null\n    },\n    {\n      &quot;empno&quot; : 7876,\n      &quot;ename&quot; : &quot;ADAMS&quot;,\n      &quot;job&quot; : &quot;CLERK&quot;,\n      &quot;mgr&quot; : 7788,\n      &quot;mgrname&quot; : &quot;SCOTT&quot;,\n      &quot;hiredate&quot; : &quot;1987-05-23T00:00:00&quot;,\n      &quot;sal&quot; : 1100,\n      &quot;comm&quot; : null\n    },\n    {\n      &quot;empno&quot; : 7902,\n      &quot;ename&quot; : &quot;FORD&quot;,\n      &quot;job&quot; : &quot;ANALYST&quot;,\n      &quot;mgr&quot; : 7566,\n      &quot;mgrname&quot; : &quot;JONES&quot;,\n      &quot;hiredate&quot; : &quot;1981-12-03T00:00:00&quot;,\n      &quot;sal&quot; : 3000,\n      &quot;comm&quot; : null\n    }\n  ]\n}\n\n{\n  &quot;_id&quot; : 40,\n  &quot;_metadata&quot; :\n  {\n    &quot;etag&quot; : &quot;28E9C49240CD26A29FDED7B253A38ED7&quot;,\n    &quot;asof&quot; : &quot;00002565300350E5&quot;\n  },\n  &quot;dname&quot; : &quot;OPERATIONS&quot;,\n  &quot;loc&quot; : &quot;BOSTON&quot;,\n  &quot;emps&quot; :\n  [\n  ]\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Json DUALITY created.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">DATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_id&quot; : 20,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_metadata&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;etag&quot; : &quot;88A4A9648C2CA1752E477545DCA85FD3&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;asof&quot; : &quot;00002565300350E5&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;dname&quot; : &quot;RESEARCH&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;loc&quot; : &quot;DALLAS&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;emps&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7369,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;SMITH&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;CLERK&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 7902,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;FORD&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1980-12-17T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 800,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7566,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;JONES&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;MANAGER&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 7839,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;KING&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1981-04-02T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 2975,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7788,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;SCOTT&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;ANALYST&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 7566,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;JONES&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1987-04-19T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 3000,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7876,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;ADAMS&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;CLERK&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 7788,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;SCOTT&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1987-05-23T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 1100,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7902,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;FORD&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;ANALYST&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 7566,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;JONES&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1981-12-03T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 3000,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_id&quot; : 40,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_metadata&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;etag&quot; : &quot;28E9C49240CD26A29FDED7B253A38ED7&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;asof&quot; : &quot;00002565300350E5&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;dname&quot; : &quot;OPERATIONS&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;loc&quot; : &quot;BOSTON&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;emps&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Since the <code>ext<\/code> column in the <code>dept<\/code> and <code>emp<\/code> table is empty for all rows, we do not see any additional fields in the two JSON documents. <\/p>\n\n\n\n<p>Due to the <code>unest<\/code> clause in line 14, the fields <code>mgr<\/code> and <code>mgrname<\/code> appear on the same level as all other fields of the table <code>emp<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"updateable-duality-view-using-graphql\">5. Updateable Duality View Using GraphQL<\/h2>\n\n\n\n<p>The next duality view is equivalent to the one in the previous chapter.<\/p>\n\n\n\n<p>The highlighted lines with annotations match the highlighted clauses in the previous statement.<\/p>\n\n\n\n<p>GraphQL requires a model for a query. The Oracle implementation uses tables, primary, and foreign keys to build the underlying model.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Some explanations<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>In line 2, we use the <code>dept<\/code> table as root. For select, insert, update and delete. This means we get a JSON document per department.<\/li>\n\n\n\n<li>In line 8, we use the <code>emp<\/code> table for the field <code>emps<\/code>. We expect an array of objects. However, we do not have to tell that explicitly. The Oracle Database will figure that out. There is just one relationship between <code>dept<\/code> and <code>emp<\/code>. Therefore it is clear how to join the tables and access the data. For select, insert, update and delete.<\/li>\n\n\n\n<li>In line 13, we use the <code>emp<\/code> table for the fields <code>mgr<\/code> and <code>mgrname<\/code>. The access is possible via the foreign keys <code>emp_mgr_fk<\/code> and <code>emp_deptno_fk<\/code>. We know that it is <code>emp_mgr_fk<\/code> but the Oracle Database does not. We have to tell it. We do that with the <code>@link(from: [mgr])<\/code> annotation, to use the <code>mgr<\/code> field for the recursive join. An update of <code>mgrname<\/code> is not allowed (it is read-only by default). An update of <code>mgr<\/code> is allowed (it will update the foreign key column in <code>emp<\/code>).<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">5) Updateable duality view using GraphQL<\/span><span role=\"button\" tabindex=\"0\" data-code=\"create or replace json duality view dept_dv as\ndept @insert @update @delete\n{\n   _id: deptno\n   dname\n   loc\n   ext @flex\n   emps: emp @insert @update @delete\n      {\n         empno\n         ename\n         job\n         emp @unnest @link(from: [mgr])\n            {\n               mgr    : empno @nocheck\n               mgrname: ename @nocheck\n            }\n         hiredate\n         sal\n         comm\n         ext @flex\n      }\n};\n\nselect json_serialize(data returning clob pretty) as data\n  from dept_dv dv\n where dv.data.&quot;_id&quot;.numberOnly() in (20, 40);\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">create or replace<\/span><span style=\"color: #D4D4D4\"> json duality <\/span><span style=\"color: #569CD6\">view<\/span><span style=\"color: #D4D4D4\"> dept_dv <\/span><span style=\"color: #569CD6\">as<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">dept @<\/span><span style=\"color: #569CD6\">insert<\/span><span style=\"color: #D4D4D4\"> @<\/span><span style=\"color: #569CD6\">update<\/span><span style=\"color: #D4D4D4\"> @<\/span><span style=\"color: #569CD6\">delete<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   _id: deptno<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   dname<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   loc<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   ext @flex<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   emps: emp @<\/span><span style=\"color: #569CD6\">insert<\/span><span style=\"color: #D4D4D4\"> @<\/span><span style=\"color: #569CD6\">update<\/span><span style=\"color: #D4D4D4\"> @<\/span><span style=\"color: #569CD6\">delete<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         empno<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         ename<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         job<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         emp @unnest @link(<\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\">: [mgr])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">               mgr    : empno @nocheck<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">               mgrname: ename @nocheck<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         hiredate<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         sal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         comm<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         ext @flex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_serialize(data <\/span><span style=\"color: #569CD6\">returning<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">clob<\/span><span style=\"color: #D4D4D4\"> pretty) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept_dv dv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> dv.data.<\/span><span style=\"color: #CE9178\">&quot;_id&quot;<\/span><span style=\"color: #D4D4D4\">.numberOnly() <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">40<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"Json DUALITY created.\n\n\nDATA\n------------------------------------------------\n{\n  &quot;_id&quot; : 20,\n  &quot;_metadata&quot; :\n  {\n    &quot;etag&quot; : &quot;88A4A9648C2CA1752E477545DCA85FD3&quot;,\n    &quot;asof&quot; : &quot;00002565301D6D5C&quot;\n  },\n  &quot;dname&quot; : &quot;RESEARCH&quot;,\n  &quot;loc&quot; : &quot;DALLAS&quot;,\n  &quot;emps&quot; :\n  [\n    {\n      &quot;empno&quot; : 7369,\n      &quot;ename&quot; : &quot;SMITH&quot;,\n      &quot;job&quot; : &quot;CLERK&quot;,\n      &quot;mgr&quot; : 7902,\n      &quot;mgrname&quot; : &quot;FORD&quot;,\n      &quot;hiredate&quot; : &quot;1980-12-17T00:00:00&quot;,\n      &quot;sal&quot; : 800,\n      &quot;comm&quot; : null\n    },\n    {\n      &quot;empno&quot; : 7566,\n      &quot;ename&quot; : &quot;JONES&quot;,\n      &quot;job&quot; : &quot;MANAGER&quot;,\n      &quot;mgr&quot; : 7839,\n      &quot;mgrname&quot; : &quot;KING&quot;,\n      &quot;hiredate&quot; : &quot;1981-04-02T00:00:00&quot;,\n      &quot;sal&quot; : 2975,\n      &quot;comm&quot; : null\n    },\n    {\n      &quot;empno&quot; : 7788,\n      &quot;ename&quot; : &quot;SCOTT&quot;,\n      &quot;job&quot; : &quot;ANALYST&quot;,\n      &quot;mgr&quot; : 7566,\n      &quot;mgrname&quot; : &quot;JONES&quot;,\n      &quot;hiredate&quot; : &quot;1987-04-19T00:00:00&quot;,\n      &quot;sal&quot; : 3000,\n      &quot;comm&quot; : null\n    },\n    {\n      &quot;empno&quot; : 7876,\n      &quot;ename&quot; : &quot;ADAMS&quot;,\n      &quot;job&quot; : &quot;CLERK&quot;,\n      &quot;mgr&quot; : 7788,\n      &quot;mgrname&quot; : &quot;SCOTT&quot;,\n      &quot;hiredate&quot; : &quot;1987-05-23T00:00:00&quot;,\n      &quot;sal&quot; : 1100,\n      &quot;comm&quot; : null\n    },\n    {\n      &quot;empno&quot; : 7902,\n      &quot;ename&quot; : &quot;FORD&quot;,\n      &quot;job&quot; : &quot;ANALYST&quot;,\n      &quot;mgr&quot; : 7566,\n      &quot;mgrname&quot; : &quot;JONES&quot;,\n      &quot;hiredate&quot; : &quot;1981-12-03T00:00:00&quot;,\n      &quot;sal&quot; : 3000,\n      &quot;comm&quot; : null\n    }\n  ]\n}\n\n{\n  &quot;_id&quot; : 40,\n  &quot;_metadata&quot; :\n  {\n    &quot;etag&quot; : &quot;28E9C49240CD26A29FDED7B253A38ED7&quot;,\n    &quot;asof&quot; : &quot;00002565301D6D5C&quot;\n  },\n  &quot;dname&quot; : &quot;OPERATIONS&quot;,\n  &quot;loc&quot; : &quot;BOSTON&quot;,\n  &quot;emps&quot; :\n  [\n  ]\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Json DUALITY created.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">DATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_id&quot; : 20,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_metadata&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;etag&quot; : &quot;88A4A9648C2CA1752E477545DCA85FD3&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;asof&quot; : &quot;00002565301D6D5C&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;dname&quot; : &quot;RESEARCH&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;loc&quot; : &quot;DALLAS&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;emps&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7369,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;SMITH&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;CLERK&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 7902,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;FORD&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1980-12-17T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 800,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7566,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;JONES&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;MANAGER&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 7839,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;KING&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1981-04-02T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 2975,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7788,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;SCOTT&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;ANALYST&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 7566,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;JONES&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1987-04-19T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 3000,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7876,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;ADAMS&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;CLERK&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 7788,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;SCOTT&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1987-05-23T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 1100,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7902,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;FORD&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;ANALYST&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 7566,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;JONES&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1981-12-03T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 3000,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_id&quot; : 40,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_metadata&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;etag&quot; : &quot;28E9C49240CD26A29FDED7B253A38ED7&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;asof&quot; : &quot;00002565301D6D5C&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;dname&quot; : &quot;OPERATIONS&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;loc&quot; : &quot;BOSTON&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;emps&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The result is the same as for the variant based on <code>select<\/code>. The only difference is the <code>asof<\/code> fields, which is expected.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"graphql-vs-select\">6. GraphQL vs. SELECT<\/h2>\n\n\n\n<p>What I like about the GraphQL variant is that the syntax is simple. It looks similar to the result document and is easy to read. No compromises due to feature parity. I run less risk of trying SQL expressions that are not applicable in a duality view.  The downside is that the definition might become ambiguous when extending the model with additional foreign key relationships. You might need to add <code>@link<\/code> annotations to your existing duality views to successfully recreate them. The variant using <code>select<\/code> cannot become ambiguous. There is no default join logic in SQL yet.<\/p>\n\n\n\n<p>However, writing complex duality views might be easier with the variant using <code>select<\/code>. I can temporarily comment out all duality-view-specific clauses to make the <code>select<\/code> part work as a standalone statement until I&#8217;m happy with the result.<\/p>\n\n\n\n<p>From a performance point of view, it should theoretically not matter which syntax variant you use. Any duality view can be built on GraphQL or <code>select<\/code>. The optimizer has all the information it needs to produce an optimal execution plan for both variants. I see no reason why the internal representation should differ.<\/p>\n\n\n\n<p>Maybe a future version of the Oracle Database will offer options to generate the preferred syntax variant independently of the originally deployed variant. By extending <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/arpls\/DBMS_METADATA.html#GUID-A4683EEE-6F54-4081-B7BF-1496096675FA\">dbms_metadata.get_ddl<\/a>, for example.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"insert-into-duality-view\">7. Insert Into Duality View<\/h2>\n\n\n\n<p>Here&#8217;s an example of inserting a JSON document with one department and two employees into the previously created duality view. <\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Some explanations<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>In line 6, we populate a department field named <code>secret<\/code> with the boolean value <code>true<\/code>. This field does not exist in the model. Therefore it will be stored in the <code>ext<\/code> column of the <code>dept<\/code> table.<\/li>\n\n\n\n<li>In line 13, we set the <code>mgr<\/code> field to <code>1<\/code>. That&#8217;s the foreign key column in the <code>emp<\/code> table.<\/li>\n\n\n\n<li>In line 16 we populate an employee field named <code>tools<\/code> with an array. The field does not exist in the model. Therefore it will be stored in the <code>ext<\/code> column of the <code>emp<\/code> table.   <\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">7) Insert into duality view (extending the schema)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"insert into dept_dv values ('\n{\n  &quot;_id&quot; : 50,\n  &quot;dname&quot; : &quot;MI6&quot;,\n  &quot;loc&quot; : &quot;LONDON&quot;,\n  &quot;secret&quot; : true,\n  &quot;emps&quot; :\n  [\n    {\n      &quot;empno&quot; : 7,\n      &quot;ename&quot; : &quot;BOND&quot;,\n      &quot;job&quot; : &quot;AGENT&quot;,\n      &quot;mgr&quot; : 1,\n      &quot;hiredate&quot; : &quot;1950-01-01T00:00:00&quot;,\n      &quot;sal&quot; : 500,\n      &quot;tools&quot; : [&quot;Knife&quot;, &quot;Garrote Watch&quot;, &quot;Walther PPK&quot;]\n    },\n    {\n      &quot;empno&quot; : 1,\n      &quot;ename&quot; : &quot;M&quot;,\n      &quot;job&quot; : &quot;MANAGER&quot;,\n      &quot;hiredate&quot; : &quot;1940-01-01T00:00:00&quot;,\n      &quot;sal&quot; : 1000,\n      &quot;comm&quot; : 8000\n    }\n  ]\n}\n');\ncommit;\n\nselect * from dept where deptno = 50;\nselect * from emp where deptno = 50;\nselect json_serialize(data returning clob pretty) as data \n  from dept_dv dv\n where dv.data.secret.booleanOnly();\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">insert<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">into<\/span><span style=\"color: #D4D4D4\"> dept_dv <\/span><span style=\"color: #569CD6\">values<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">  &quot;_id&quot; : 50,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">  &quot;dname&quot; : &quot;MI6&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">  &quot;loc&quot; : &quot;LONDON&quot;,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #CE9178\">  &quot;secret&quot; : true,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">  &quot;emps&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">  [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;empno&quot; : 7,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;ename&quot; : &quot;BOND&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;job&quot; : &quot;AGENT&quot;,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #CE9178\">      &quot;mgr&quot; : 1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;hiredate&quot; : &quot;1950-01-01T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;sal&quot; : 500,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #CE9178\">      &quot;tools&quot; : [&quot;Knife&quot;, &quot;Garrote Watch&quot;, &quot;Walther PPK&quot;]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;empno&quot; : 1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;ename&quot; : &quot;M&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;job&quot; : &quot;MANAGER&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;hiredate&quot; : &quot;1940-01-01T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;sal&quot; : 1000,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">      &quot;comm&quot; : 8000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">  ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">commit<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> deptno = <\/span><span style=\"color: #B5CEA8\">50<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> emp <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> deptno = <\/span><span style=\"color: #B5CEA8\">50<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_serialize(data <\/span><span style=\"color: #569CD6\">returning<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">clob<\/span><span style=\"color: #D4D4D4\"> pretty) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> data <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept_dv dv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> dv.data.secret.booleanOnly();<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"1 row inserted.\n\n\nCommit complete.\n\n\n    DEPTNO DNAME          LOC           EXT\n---------- -------------- ------------- --------------------\n        50 MI6            LONDON        {&quot;secret&quot;:true}\n\n\n     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO EXT\n---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- ---------------------------------------------------\n         1 M          MANAGER              1940-01-01       1000       8000         50\n         7 BOND       AGENT              1 1950-01-01        500                    50 {&quot;tools&quot;:[&quot;Knife&quot;,&quot;Garrote Watch&quot;,&quot;Walther PPK&quot;]}\n\n\nDATA\n------------------------------------------------\n{\n  &quot;_id&quot; : 50,\n  &quot;_metadata&quot; :\n  {\n    &quot;etag&quot; : &quot;486256AA33D638F4D339FFE534EC910F&quot;,\n    &quot;asof&quot; : &quot;0000256530950ADB&quot;\n  },\n  &quot;dname&quot; : &quot;MI6&quot;,\n  &quot;loc&quot; : &quot;LONDON&quot;,\n  &quot;emps&quot; :\n  [\n    {\n      &quot;empno&quot; : 1,\n      &quot;ename&quot; : &quot;M&quot;,\n      &quot;job&quot; : &quot;MANAGER&quot;,\n      &quot;hiredate&quot; : &quot;1940-01-01T00:00:00&quot;,\n      &quot;sal&quot; : 1000,\n      &quot;comm&quot; : 8000\n    },\n    {\n      &quot;empno&quot; : 7,\n      &quot;ename&quot; : &quot;BOND&quot;,\n      &quot;job&quot; : &quot;AGENT&quot;,\n      &quot;mgr&quot; : 1,\n      &quot;mgrname&quot; : &quot;M&quot;,\n      &quot;hiredate&quot; : &quot;1950-01-01T00:00:00&quot;,\n      &quot;sal&quot; : 500,\n      &quot;comm&quot; : null,\n      &quot;tools&quot; :\n      [\n        &quot;Knife&quot;,\n        &quot;Garrote Watch&quot;,\n        &quot;Walther PPK&quot;\n      ]\n    }\n  ],\n  &quot;secret&quot; : true\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">1 row inserted.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Commit complete.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    DEPTNO DNAME          LOC           EXT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- -------------- ------------- --------------------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        50 MI6            LONDON        {&quot;secret&quot;:true}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO EXT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- ---------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         1 M          MANAGER              1940-01-01       1000       8000         50<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         7 BOND       AGENT              1 1950-01-01        500                    50 {&quot;tools&quot;:[&quot;Knife&quot;,&quot;Garrote Watch&quot;,&quot;Walther PPK&quot;]}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">DATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_id&quot; : 50,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_metadata&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;etag&quot; : &quot;486256AA33D638F4D339FFE534EC910F&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;asof&quot; : &quot;0000256530950ADB&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;dname&quot; : &quot;MI6&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;loc&quot; : &quot;LONDON&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;emps&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;M&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;MANAGER&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1940-01-01T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 1000,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : 8000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;BOND&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;AGENT&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;M&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1950-01-01T00:00:00&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 500,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      &quot;tools&quot; :<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      [<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        &quot;Knife&quot;,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        &quot;Garrote Watch&quot;,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        &quot;Walther PPK&quot;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ],<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  &quot;secret&quot; : true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>One insert statement leads to three new rows in two tables. Before 23ai, a view and an instead-of trigger would have been required for this.<\/p>\n\n\n\n<p>The fields <code>secret<\/code> and <code>tools<\/code> are automatically stored in the flex columns <code>ext<\/code>. This shows how easy it is to extend the data model on the fly with an <code>insert<\/code> statement. Without DDL statements. Without PL\/SQL code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"update-duality-view\">8. Update Duality View<\/h2>\n\n\n\n<p>Let&#8217;s update the previously created document.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Some explanations<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>In line 4, we add a new field named <code>street<\/code> for the department <code>50<\/code>.<\/li>\n\n\n\n<li>In line 6, we change the salary for all employees in the department <code>50<\/code> by the factor of <code>42<\/code>.<\/li>\n\n\n\n<li>In line 9, we increase the salary of <code>BOND<\/code> by <code>1<\/code>. Please note that this is the second change of the salary for this employee in this <code>update<\/code> statement.<\/li>\n\n\n\n<li>In line 10, we append the <code>Aston Martin DB5<\/code> to the list of <code>BOND<\/code>&#8216;s tools.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">8) Update duality view (extending the schema again)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"update dept_dv v\n   set v.data = json_transform(\n                   v.data, \n                   set '$.street' = '85 Albert Embankment',\n                   nested '$.emps[*]' (\n                      set '@.sal' = path '@.sal * 42'\n                   ),\n                   nested '$.emps[*]?(@.ename == &quot;BOND&quot;)' (\n                      set '@.sal' = path '@.sal + 1',\n                      append '@.tools' = 'Aston Martin DB5'\n                   )\n                )\n where v.data.&quot;_id&quot;.numberOnly() = 50;\ncommit;\n\nselect * from dept where deptno = 50;\nselect * from emp where deptno = 50;\nselect json_serialize(data returning clob pretty) as data \n  from dept_dv v\n where v.data.&quot;_id&quot;.numberOnly() = 50;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">update<\/span><span style=\"color: #D4D4D4\"> dept_dv v<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\"> v.data = json_transform(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   v.data, <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;$.street&#39;<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#39;85 Albert Embankment&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   nested <\/span><span style=\"color: #CE9178\">&#39;$.emps[*]&#39;<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;@.sal&#39;<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">path<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;@.sal * 42&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   nested <\/span><span style=\"color: #CE9178\">&#39;$.emps[*]?(@.ename == &quot;BOND&quot;)&#39;<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;@.sal&#39;<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">path<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;@.sal + 1&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                      append <\/span><span style=\"color: #CE9178\">&#39;@.tools&#39;<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#39;Aston Martin DB5&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> v.data.<\/span><span style=\"color: #CE9178\">&quot;_id&quot;<\/span><span style=\"color: #D4D4D4\">.numberOnly() = <\/span><span style=\"color: #B5CEA8\">50<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">commit<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> deptno = <\/span><span style=\"color: #B5CEA8\">50<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> emp <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> deptno = <\/span><span style=\"color: #B5CEA8\">50<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> json_serialize(data <\/span><span style=\"color: #569CD6\">returning<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">clob<\/span><span style=\"color: #D4D4D4\"> pretty) <\/span><span style=\"color: #569CD6\">as<\/span><span style=\"color: #D4D4D4\"> data <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept_dv v<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> v.data.<\/span><span style=\"color: #CE9178\">&quot;_id&quot;<\/span><span style=\"color: #D4D4D4\">.numberOnly() = <\/span><span style=\"color: #B5CEA8\">50<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"1 row updated.\n\n\nCommit complete.\n\n\n    DEPTNO DNAME          LOC           EXT\n---------- -------------- ------------- -----------------------------------------------\n        50 MI6            LONDON        {&quot;secret&quot;:true,&quot;street&quot;:&quot;85 Albert Embankment&quot;}\n\n\n     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO EXT\n---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- ----------------------------------------------------------------------\n         1 M          MANAGER              1940-01-01      42000       8000         50\n         7 BOND       AGENT              1 1950-01-01      21001                    50 {&quot;tools&quot;:[&quot;Knife&quot;,&quot;Garrote Watch&quot;,&quot;Walther PPK&quot;,&quot;Aston Martin DB5&quot;]}\n\n\nDATA\n------------------------------------------------\n{\n  &quot;_id&quot; : 50,\n  &quot;_metadata&quot; :\n  {\n    &quot;etag&quot; : &quot;1591A6C3A20C4BC85C0498F7B1F4031F&quot;,\n    &quot;asof&quot; : &quot;000025653374F0C7&quot;\n  },\n  &quot;dname&quot; : &quot;MI6&quot;,\n  &quot;loc&quot; : &quot;LONDON&quot;,\n  &quot;emps&quot; :\n  [\n    {\n      &quot;empno&quot; : 1,\n      &quot;ename&quot; : &quot;M&quot;,\n      &quot;job&quot; : &quot;MANAGER&quot;,\n      &quot;hiredate&quot; : &quot;1940-01-01T00:00:00&quot;,\n      &quot;sal&quot; : 42000,\n      &quot;comm&quot; : 8000\n    },\n    {\n      &quot;empno&quot; : 7,\n      &quot;ename&quot; : &quot;BOND&quot;,\n      &quot;job&quot; : &quot;AGENT&quot;,\n      &quot;mgr&quot; : 1,\n      &quot;mgrname&quot; : &quot;M&quot;,\n      &quot;hiredate&quot; : &quot;1950-01-01T00:00:00&quot;,\n      &quot;sal&quot; : 21001,\n      &quot;comm&quot; : null,\n      &quot;tools&quot; :\n      [\n        &quot;Knife&quot;,\n        &quot;Garrote Watch&quot;,\n        &quot;Walther PPK&quot;,\n        &quot;Aston Martin DB5&quot;\n      ]\n    }\n  ],\n  &quot;secret&quot; : true,\n  &quot;street&quot; : &quot;85 Albert Embankment&quot;\n}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">1 row updated.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Commit complete.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    DEPTNO DNAME          LOC           EXT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- -------------- ------------- -----------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        50 MI6            LONDON        {&quot;secret&quot;:true,&quot;street&quot;:&quot;85 Albert Embankment&quot;}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO EXT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- ----------------------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         1 M          MANAGER              1940-01-01      42000       8000         50<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         7 BOND       AGENT              1 1950-01-01      21001                    50 {&quot;tools&quot;:[&quot;Knife&quot;,&quot;Garrote Watch&quot;,&quot;Walther PPK&quot;,&quot;Aston Martin DB5&quot;]}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">DATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_id&quot; : 50,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;_metadata&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;etag&quot; : &quot;1591A6C3A20C4BC85C0498F7B1F4031F&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &quot;asof&quot; : &quot;000025653374F0C7&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;dname&quot; : &quot;MI6&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;loc&quot; : &quot;LONDON&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;emps&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;M&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;MANAGER&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1940-01-01T00:00:00&quot;,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 42000,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : 8000<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;empno&quot; : 7,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;ename&quot; : &quot;BOND&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;job&quot; : &quot;AGENT&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgr&quot; : 1,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;mgrname&quot; : &quot;M&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;hiredate&quot; : &quot;1950-01-01T00:00:00&quot;,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      &quot;sal&quot; : 21001,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;comm&quot; : null,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &quot;tools&quot; :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        &quot;Knife&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        &quot;Garrote Watch&quot;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        &quot;Walther PPK&quot;,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        &quot;Aston Martin DB5&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ],<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  &quot;secret&quot; : true,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  &quot;street&quot; : &quot;85 Albert Embankment&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"delete-from-duality-view\">9. Delete From Duality View<\/h2>\n\n\n\n<p>And now, let&#8217;s delete department 50 with all its employees to restore the original content of the <code>dept<\/code> and <code>emp<\/code> tables.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">9) Delete from duality view<\/span><span role=\"button\" tabindex=\"0\" data-code=\"delete dept_dv v\n where v.data.&quot;_id&quot;.numberOnly() = 50;\ncommit;\n\nselect * from dept order by deptno;\nselect * from emp order by deptno, empno;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">delete<\/span><span style=\"color: #D4D4D4\"> dept_dv v<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">where<\/span><span style=\"color: #D4D4D4\"> v.data.<\/span><span style=\"color: #CE9178\">&quot;_id&quot;<\/span><span style=\"color: #D4D4D4\">.numberOnly() = <\/span><span style=\"color: #B5CEA8\">50<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">commit<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> dept <\/span><span style=\"color: #569CD6\">order by<\/span><span style=\"color: #D4D4D4\"> deptno;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> emp <\/span><span style=\"color: #569CD6\">order by<\/span><span style=\"color: #D4D4D4\"> deptno, empno;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" data-code=\"1 row deleted.\n\n\nCommit complete.\n\n\n    DEPTNO DNAME          LOC           EXT\n---------- -------------- ------------- --------------------\n        10 ACCOUNTING     NEW YORK\n        20 RESEARCH       DALLAS\n        30 SALES          CHICAGO\n        40 OPERATIONS     BOSTON\n\n\n     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO EXT\n---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- --------------------\n      7782 CLARK      MANAGER         7839 1981-06-09       2450                    10\n      7839 KING       PRESIDENT            1981-11-17       5000                    10\n      7934 MILLER     CLERK           7782 1982-01-23       1300                    10\n      7369 SMITH      CLERK           7902 1980-12-17        800                    20\n      7566 JONES      MANAGER         7839 1981-04-02       2975                    20\n      7788 SCOTT      ANALYST         7566 1987-04-19       3000                    20\n      7876 ADAMS      CLERK           7788 1987-05-23       1100                    20\n      7902 FORD       ANALYST         7566 1981-12-03       3000                    20\n      7499 ALLEN      SALESMAN        7698 1981-02-20       1600        300         30\n      7521 WARD       SALESMAN        7698 1981-02-22       1250        500         30\n      7654 MARTIN     SALESMAN        7698 1981-09-28       1250       1400         30\n      7698 BLAKE      MANAGER         7839 1981-05-01       2850                    30\n      7844 TURNER     SALESMAN        7698 1981-09-08       1500          0         30\n      7900 JAMES      CLERK           7698 1981-12-03        950                    30\n\n14 rows selected.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">1 row deleted.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Commit complete.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    DEPTNO DNAME          LOC           EXT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- -------------- ------------- --------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        10 ACCOUNTING     NEW YORK<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        20 RESEARCH       DALLAS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        30 SALES          CHICAGO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        40 OPERATIONS     BOSTON<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO EXT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- --------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7782 CLARK      MANAGER         7839 1981-06-09       2450                    10<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7839 KING       PRESIDENT            1981-11-17       5000                    10<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7934 MILLER     CLERK           7782 1982-01-23       1300                    10<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7369 SMITH      CLERK           7902 1980-12-17        800                    20<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7566 JONES      MANAGER         7839 1981-04-02       2975                    20<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7788 SCOTT      ANALYST         7566 1987-04-19       3000                    20<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7876 ADAMS      CLERK           7788 1987-05-23       1100                    20<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7902 FORD       ANALYST         7566 1981-12-03       3000                    20<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7499 ALLEN      SALESMAN        7698 1981-02-20       1600        300         30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7521 WARD       SALESMAN        7698 1981-02-22       1250        500         30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7654 MARTIN     SALESMAN        7698 1981-09-28       1250       1400         30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7698 BLAKE      MANAGER         7839 1981-05-01       2850                    30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7844 TURNER     SALESMAN        7698 1981-09-08       1500          0         30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      7900 JAMES      CLERK           7698 1981-12-03        950                    30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">14 rows selected.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Outlook<\/h2>\n\n\n\n<p>One thing is missing in version 0.9 of IslandSQL grammar. The support of PL\/pgSQL in PostgreSQL statements <code>create function<\/code>, <code>create procedure<\/code>, <code>create trigger<\/code> and <code>do<\/code>. These statements can already be parsed but the PL\/pgSQL code passed as string is not further analyzed. This will change in the next and final episode of this season.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In the last episode, we looked at some new features in Oracle Database 23.4. The IslandSQL grammar now covers all statements that can contain static DML statements and code in PL\/SQL and PL\/pgSQL. While implementing the ANTLR grammar for the create JSON relational duality view statement I stumbled over GraphQL in<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":13502,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[139,86,137,140,111,85],"class_list":["post-13430","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-antlr","tag-code-analysis","tag-islandsql","tag-oracle-26ai","tag-postgresql","tag-sql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"description\" content=\"In this episode, we select, insert, update and delete from a JSON-relational duality view using GraphQL and a flexible schema.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"In this episode, we select, insert, update and delete from a JSON-relational duality view using GraphQL and a flexible schema.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-27T11:31:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-07-01T22:12:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL9.png\" \/>\n\t<meta property=\"og:image:width\" content=\"500\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views\",\"datePublished\":\"2024-06-27T11:31:12+00:00\",\"dateModified\":\"2024-07-01T22:12:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/\"},\"wordCount\":1469,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/IslandSQL9.png\",\"keywords\":[\"ANTLR\",\"Code Analysis\",\"IslandSQL\",\"Oracle 26ai\",\"PostgreSQL\",\"SQL\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/\",\"name\":\"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/IslandSQL9.png\",\"datePublished\":\"2024-06-27T11:31:12+00:00\",\"dateModified\":\"2024-07-01T22:12:57+00:00\",\"description\":\"In this episode, we select, insert, update and delete from a JSON-relational duality view using GraphQL and a flexible schema.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/IslandSQL9.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/IslandSQL9.png\",\"width\":500,\"height\":500,\"caption\":\"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2024\\\/06\\\/27\\\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views - Philipp Salvisberg&#039;s Blog","description":"In this episode, we select, insert, update and delete from a JSON-relational duality view using GraphQL and a flexible schema.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/","og_locale":"en_US","og_type":"article","og_title":"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views - Philipp Salvisberg&#039;s Blog","og_description":"In this episode, we select, insert, update and delete from a JSON-relational duality view using GraphQL and a flexible schema.","og_url":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2024-06-27T11:31:12+00:00","article_modified_time":"2024-07-01T22:12:57+00:00","og_image":[{"width":500,"height":500,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL9.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views","datePublished":"2024-06-27T11:31:12+00:00","dateModified":"2024-07-01T22:12:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/"},"wordCount":1469,"commentCount":0,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL9.png","keywords":["ANTLR","Code Analysis","IslandSQL","Oracle 26ai","PostgreSQL","SQL"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/","url":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/","name":"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL9.png","datePublished":"2024-06-27T11:31:12+00:00","dateModified":"2024-07-01T22:12:57+00:00","description":"In this episode, we select, insert, update and delete from a JSON-relational duality view using GraphQL and a flexible schema.","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL9.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2024\/06\/IslandSQL9.png","width":500,"height":500,"caption":"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views"},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2024\/06\/27\/islandsql-episode-9-graphql-json-and-flexible-schemas-with-duality-views\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"IslandSQL Episode 9: GraphQL, JSON and Flexible Schemas With Duality Views"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/13430","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=13430"}],"version-history":[{"count":86,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/13430\/revisions"}],"predecessor-version":[{"id":13524,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/13430\/revisions\/13524"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/13502"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=13430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=13430"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=13430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}