2017-08-04 103 views
-2

我有一個筆記形式,我打電話給兩個不同的頁面,並在第一頁上的同一個表中存儲數據的參數是p4_clid和第2頁上它是p21_entity。當我在第一頁上輸入數據時,數據會被插入,但在第二頁上它不會,我如何在觸發器中傳遞我的頁面兩個參數。Orcacle Apex觸發器

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

首先你的方法是不正確的。使用頁面進程執行DML操作。當你給出v('P4_CHILD')時,在你的代碼中,你怎麼能期望P21_ENTITY項的值。 – Himanshujaggi

+0

我正在使用頁面進程DML僅用於插入更新和刪除。就像我說我有一個表單,我打電話給兩個不同的頁面,一頁標識爲p4_clid,另一個由p21_entity,當我在p4_clid頁面上執行DMl時,它的工作原理和現在我需要在p21上執行dml。我如何在我的觸發器中傳遞兩個項目值。 –

回答

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,這樣就不會rk。)

我必須同意評論說你的方法是不正確的。

正常的做法是在表單頁面中有一個隱藏的項目 - 假設您的表單頁面是第33頁,而項目是P33_ID。當你調用從4頁您在P4_CLID的值傳遞的URL形式:

f?p=...:P33_ID,...:&P21_ENTITY,... 

然後,您使用的值:

f?p=...:P33_ID,...:&P4_CLID,... 

從21頁你P21_ENTITY的值,而不是通過直接在INSERT語句中的P33_ID - 不在數據庫觸發器中。

在包含觸發器的數據庫代碼中,依賴APEX會話狀態通常是不好的做法,因爲它假定可以通過APEX應用程序插入/更新/刪除數據的唯一方式。這對你來說可能是真的,但它不是面向未來的。

+0

用例說明解決了它,謝謝了。 –

相關問題