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 应用程序。这对你现在可能是正确的,但它不是面向未来的。