Oracle Apex 触发器
Orcacle Apex Trigger
我有一个笔记表格,我在两个不同的页面上调用它并将数据存储在同一个 table 中,第一页的参数是 p4_clid,第二页的参数是 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;
要回答您的具体问题,我想您可以在触发器中执行此操作:
无论你在哪里:
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')
但那总是 return 您的表单页面的 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 会话状态通常是一种不好的做法,因为它假设数据可以 inserted/updated/deleted 的唯一方式是通过您的 APEX 应用程序。这对你现在可能是正确的,但它不是面向未来的。
我有一个笔记表格,我在两个不同的页面上调用它并将数据存储在同一个 table 中,第一页的参数是 p4_clid,第二页的参数是 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;
要回答您的具体问题,我想您可以在触发器中执行此操作:
无论你在哪里:
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')
但那总是 return 您的表单页面的 ID,所以那行不通。)
我不得不同意评论说你的做法不正确。
通常的方法是在您的表单页面中隐藏一个项目 - 假设您的表单页面是第 33 页,该项目是 P33_ID
。当您从第 4 页调用表单时,您在 URL:
f?p=...:P33_ID,...:&P4_CLID,...
从第 21 页开始,您传入 P21_ENTITY 的值:
f?p=...:P33_ID,...:&P21_ENTITY,...
然后您直接在 INSERT 语句中使用 P33_ID 的值 - 而不是在数据库触发器中。
在包括触发器在内的数据库代码中依赖 APEX 会话状态通常是一种不好的做法,因为它假设数据可以 inserted/updated/deleted 的唯一方式是通过您的 APEX 应用程序。这对你现在可能是正确的,但它不是面向未来的。