2016-08-29 88 views
1

我有一個基於一個簡單的SQL像的Oracle APEX表格形式MRU過程

以表格形式
select col1, col2, check_box from view1 

用戶可以更新形式check_box和COL1和COL2將根據check_box是否被選中被操縱或不。然後,基表將由我創建的MRU進程在數據庫中更新。

我是,除了使用MRU更新基表,我也想調用另一個PROC做基於check_box別的形式

例如問題

if check_box is unchecked, then col1 and col2 will be blanked by the MRU; 
if check_box is checked, col1 and col2 will be updated to 'Done' by the MRU, 
also a proc should be called to do something else. 

我的問題是,我應該堅持的MRU方法(如MRU有上升空間,包括丟失更新檢測,鎖定等),並創建一個單獨的進程調用PROC,或者我應該只需創建一個可以執行這兩個操作的進程(像循環遍歷報表的每一行,更新基表以及check_box被選中時調用proc)?

什麼是更好的apporach?

+0

你確定你正在討論一個交互式報告而不是表格形式(可更新的sql查詢)嗎? – Tom

+0

對不起我的壞...是的,你是對的,這是一個表格形式。 –

+0

如果需要爲每個更新的記錄運行該過程,則將其放入相同的MRU過程中。如果只是每個頁面請求運行一次,那麼您將創建它作爲一個單獨的過程。 –

回答

1

您可以將進程與表格關聯起來。這樣做會導致以表格形式爲每個記錄運行該進程(儘管您可以指定執行範圍,以便它將針對每一行運行或僅針對新的/更新的行)。
在這個過程中,您可以通過使用綁定變量語法來引用表格形式中的每一列。如果該列是可更新的,您也可以更改該值。 您可以在MRU之前運行一個進程,並更改col1和col2的值。

IF :CHECK_COL IS NULL THEN 
    :COL1 := NULL; 
    :COL2 := NULL; 
ELSE 
    :COL1 := 'Done'; 
    :COL2 := 'Done'; 
END IF; 

然後創建一個進程,在MRU之後運行並運行該過程。

MY_PROCEDURE(:SOME_COL); 

請記住,如果在程序上是由MRU改變記錄,運行此程序進行DML會導致MRU失敗因迷路更新檢測(不匹配校驗)。

+0

Tom,有沒有一種方法可以指定一個過程或程序包過程,以便它只對整個表格形式運行一次,並且在此過程中有某種循環來遍歷行? –

+0

@ThomasTschernich有 - 雖然我不確定會有什麼區別?這裏apex會調用這個過程(並且注意:你可以檢查每一行的行(創建,更新)的狀態),而在你的循環中,你將調用每行的過程?除非你想做其他一些先進的事情? – Tom

+0

也許只是在行之間存在依賴關係。我現在無法提供一個例子,但以防在未來的某個時間點偶然發現這種情況。我發現一些額外的信息[這裏](http://stackoverflow.com/questions/3962731/update-apex-tabular-form-with-plsql?rq=1),但這是非常古老的,似乎很難記錄。 –

相關問題