Orcacle Apex Trigger

时间:2017-08-04 03:38:49

标签: oracle triggers oracle-apex

我有一个备注表单,我在两个不同的页面上调用并在第一页的同一个表中存储数据,参数是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;

1 个答案:

答案 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应用程序插入/更新/删除数据的唯一方式。对你来说这可能是真的,但它不是面向未来的。