先将数据块的Query 表与DML 目标表分别设置,
然后将非DML 表的字段设置Query only 设置“是”。
如果数据源是一张多表视图,并且要将数据更新到多张表中。要实现此功能方法很多。
方法一:可以手工在form 中编写insert、update、delete、lock 触发器。此方法代码量较大。
方法二:使用基于视图的instead of 触发器。本文采用此方法。
1.创建两张表
CREATE TABLE T1(T_ID INT,T1_NAME VARCHAR2(30));
CREATE TABLE T2(T_ID INT,T2_ADDRESS VARCHAR2(50));
2.创建一张含有多张表的视图
create or replace view T1_T2_V as
SELECT T1.T_ID,T1.T1_NAME,T2.T2_ADDRESS FROM
T1,T2 WHERE T1.T_ID=T2.T_ID;
3. 创建一个Instead of 视图触发器
create or replace trigger tr_t1
instead of insert or update or delete on T1_T2_V
for each row
begin
declare
begin
if inserting then
insert into T1 values(:new.T_ID,:new.T1_NAME);
insert into T2 values(:new.T_ID,:new.T2_ADDRESS);
elsif updating then
update T1 set T_ID=:new.T_ID,T1_NAME=:new.T1_NAME
where T_ID=:old.T_ID;
update T2 set T_ID=:new.T_ID,T2_ADDRESS=:new.T2_ADDRESS
where T_ID=:old.T_ID;
else
delete from T1 where T_ID=:old.T_ID;
delete from T2 where T_ID=:old.T_ID;
end if;
end;
end tr_t1;
4.按标准的FORM 开发步骤,修改template。
将数据块的查询源调成前面开发的VIEW,DML 目标表留空。
编译及注册到EBS 环境中。发现insert 可以成功,但update、delete 出错。
解决:将该数据块的键模式设成“可更新”
OK,这样就完成Form 的多表视图更新啦。总结一下,就四大点:
1 设置数据块属性为“允许使用主键”;
2 设置一到多个主键项目;
3 将数据块的“键模式”属性设置为可更新。
4 编写一个instead of 触发器。