场景描述
开发中遇到一个情况:前台页面是一个角色对用户的批量授权,其中用户是多选,多选的结果是控件里会填入逗号分隔的用户ID字符串,比如“TOM,JERRY”,最终要分别插入2张一对多的主从表中。
--主表
CREATE TABLE T_MAIN
(GUID VARCHAR2(32) primary key
,GRANTOR VARCHAR2(30)
,ROLEID VARCHAR2(10)
,CREATED DATE
);
--从表
CREATE TABLE T_DETAIL
(GUID VARCHAR2(32)
,GRANTEE VARCHAR2(32)
,ROLEID VARCHAR2(10)
);
--前台展示的的是一个视图:
CREATE OR REPLACE VIEW V_MAIN_DETAIL AS
SELECT A.GUID,A.GRANTOR,A.ROLEID,A.CREATED,TO_CHAR(WM_CONCAT(B.GRANTEE)) GRANTEES
FROM T_MAIN A,T_DETAIL B
WHERE A.GUID=B.GUID
GROUP BY A.GUID,A.GRANTOR,A.ROLEID,A.CREATED;
前台实现的做法是在主表中插入数据,然后对用户多选结果进行循环插入从表。
今天介绍一种后台实现的方式,即前台只需对视图进行增删改查。
大家知道,Oracle里的视图是不能做DML操作的,尽快Oracle做了很多改进,比如对单表视图或一对一键值关联的多表视图可以做增删改。但一对多或者多对多关联的视图还是不支持增删改操作,会报错ORA-01779: cannot modify a column which maps to a non key-preserved table
事实上,Oracle还提供一个变通方式来完成对视图的增删改操作。就是用instead of触发器。