暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 薛晓刚 2024-11-26
191

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

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可以再向全栈迈进一步。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论