我有一个备注表单,我在两个不同的页面上调用并在第一页的同一个表中存储数据,参数是p4_clid,在第2页,它是p21_entity。当我在第一页输入数据时,数据会被插入,但在第二页则没有,我如何在触发器中传递我的页面两个参数。
create or replace TRIGGER "BI_f_41"
before insert or update on "f_41"
for each row
begin
if inserting and :new.FORMRESPONSEID is null then
select "NEW_F41_SEQ".nextval
into :new.FORMRESPONSEID
from dual;
end if;
if inserting then
:new.SubjectID := get_subidn(v('P4_CLID')) ;
:new.FORMID := 41 ;
:new.subjecttypeid := 1 ;
:new.responseCreatedDate := localtimestamp;
:new.ProgramID := get_pgmid(v('P4_CLID')) ;
:new.AuditStaffID := v('SESSION_GIHUID');
:new.AuditDate := localtimestamp;
end if;
if updating then
:new.AuditDate := localtimestamp;
end if;
end;
答案 0 :(得分:0)
要回答您的具体问题,我想您可以在触发器中执行此操作:
无论您身在何处:
v('P4_CLID')
替换为:
case [something that indicates the calling page]*
when 4 then v('P4_CLID')
when 21 then v('P21_ENTITY')
end
(*我会说nv('APP_PAGE_ID')
,但这将始终返回您的表单页面的ID,因此无效。)
我必须同意那些说你的方法不正确的评论。
通常的做法是在表单页面中隐藏一个项目 - 假设您的表单页面是第33页,项目是P33_ID
。当您从第4页调用表单时,您将在URL中传递P4_CLID的值:
f?p=...:P33_ID,...:&P4_CLID,...
从第21页开始,传递P21_ENTITY的值:
f?p=...:P33_ID,...:&P21_ENTITY,...
然后直接在INSERT语句中使用P33_ID的值 - 而不是在数据库触发器中。
在数据库代码(包括触发器)中依赖APEX会话状态通常是不好的做法,因为它假定可以通过您的APEX应用程序插入/更新/删除数据的唯一方式。对你来说这可能是真的,但它不是面向未来的。