全 网 第 一 份JSON二元性“写操作”的实践

来源:这里教程网 时间:2026-03-03 20:56:41 作者:

这个概念提出不是一天两天了

image.png 具体怎么查,官方给出是一个课表之类的用例。但是这个其实让普遍的人认识不深刻。为此我看尹总监写过一篇以订单为用例的建模查询。我是看懂了。不过我不满足于此,我想看看怎么改。

全文实践的只有查询,那么写呢?

我开始的理解(我其实理解错了),就是对着表更新一行,他就把这行的一个字段更新了,如果这个字段在其他表上也有,那么一并更新了。这是我个人的理解。

实验数据如下(我和官方的不一样)

建表和初始化实验数据 –users create table users (user_id number, user_name varchar2(20), CONSTRAINT users_pk PRIMARY KEY(user_id)); insert into users values(1,‘薛晓刚’); insert into users values(2,‘李世民’); insert into users values(3,‘朱元璋’); insert into users values(4,‘狄仁杰’);

–products create table products (product_id number, product_name varchar2(20), price_number number, type_id number, type_name varchar2(20), CONSTRAINT products_pk PRIMARY KEY(product_id)); insert into products values(1,‘AK47’,2000,1,‘枪’); insert into products values(2,‘虎式坦克’,40,2,‘坦克’); insert into products values(3,‘F16’,15,3,‘飞机’); insert into products values(4,‘民兵3’,100,4,‘核弹’);

–orders create table orders (order_id varchar2(20), order_time timestamp, user_id number, CONSTRAINT orders_pk PRIMARY KEY(order_id), CONSTRAINT orders_fk FOREIGN KEY(user_id) REFERENCES users(user_id)); insert into orders values(‘D1’,sysdate-4,1); insert into orders values(‘D2’,sysdate-3,2); insert into orders values(‘D3’,sysdate-2,3); insert into orders values(‘D4’,sysdate-1,4);

–order_details create table order_details (sub_id varchar2(20), order_id varchar2(20), product_id number, CONSTRAINT od_pk PRIMARY KEY(sub_id), CONSTRAINT od_fk1 FOREIGN KEY(order_id) REFERENCES orders(order_id), CONSTRAINT od_fk2 FOREIGN KEY(product_id) REFERENCES products(product_id));

insert into order_details values(11,‘D1’,1); insert into order_details values(12,‘D1’,1); insert into order_details values(13,‘D1’,1); insert into order_details values(21,‘D2’,2); insert into order_details values(22,‘D2’,2); insert into order_details values(23,‘D2’,2); insert into order_details values(31,‘D3’,3); insert into order_details values(32,‘D3’,3); insert into order_details values(33,‘D3’,3); insert into order_details values(41,‘D4’,4); insert into order_details values(42,‘D4’,4); insert into order_details values(43,‘D4’,4); commit;

然后创建视图。 CREATE or replace JSON DUALITY VIEW orders_json AS orders @insert @update @delete { _id : order_id, ordertime : order_time, users @unnest@update { cid : user_id, username : user_name }, details : order_details [ { subid : sub_id products { pn : product_id, pname : product_name, price : price_number } } ] };

实际遇到问题

我想改订单号(其实语法不是这样的) image.png

之所以敢说是第一是因为还动用了原厂的支持

    

    网上根本查不到怎么做。然后找原厂求助。原厂的专家很快就告知我应该是这样的。 image.png

    不过我还是失败了。 image.png

版本更新的太快了

专家也很快意识到了是版本问题。我的版本太新了。这是因为我这个是docker安装的,拉取了最新的。

image.png

新的版本要注意这里 image.png

然后就可以了。所以我说这是全 网 第 一份。因为没有人写过update 二元性视图。其次这个问题还会涉及到版本问题。

这样的意义何在?

   我更新一行难道不能直接更新基表吗?做的这么麻烦干什么?这点上专家给予我了解答。因为这个的真实场景就不是这样用的。    最佳实践是,开发接口时候对于类似restful这样的接口,给出去是一串JSON串。也可能对方最后返回一串JSON串。那这里改了什么不好区分。但是用这种方法会写回去的时候,那么就是对着这个视图进行更新。然后这个视图就直接操作基表把相关的数据(可能涉及到多个表)的一起改了。而且还在一个事务中。 说到了这个restful也是上个月在处理APEX低代码时候才去了解了。那次是因为要做ords的多数据源。现在想想前段时间的学习都是铺垫了。

     你说这是Oracle规划的好还是设计的好? 多模打通了数据模型,仅仅在这里又有低代码加持。而APEX已经在Oracle上大杀四方,以后还要支持MySQL。而低代码又让DBA可以再向全栈迈进一步。

相关推荐