2012-08-06 88 views
0

我有一個數據塊(基於視圖)的表格形式(顯示4條記錄)。Oracle表格10g,多重插入和更新不起作用

查詢後,表單無法更新所有記錄,但只有第一個記錄值可以從LOV中選擇。

我在插入和更新中調用了一個過程。

查詢是這樣的:

PACKAGE BODY MAPPING IS 

PROCEDURE INSERT_ROW(EVENT_NAME IN VARCHAR2) 
IS 
BEGIN 
IF (EVENT_NAME = 'ON-INSERT') THEN 


INSERT INTO XX_REC_MAPPING 
(BRANCH_CODE,COLLECTION_ID,PAY_MODE_ID,RECEIPT_METHOD,CREATED_BY, 
CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN) 
VALUES 
(:XX_REC_MAPPING.OFFICE_CODE, 
:XX_REC_MAPPING.COLLECTION_ID, 
:XX_REC_MAPPING.PAY_MODE_ID, 
:XX_REC_MAPPING.RECEIPT_METHOD, 
:XX_REC_MAPPING.CREATED_BY, 
:XX_REC_MAPPING.CREATION_DATE, 
:XX_REC_MAPPING.LAST_UPDATED_BY, 
:XX_REC_MAPPING.LAST_UPDATE_DATE, 
:XX_REC_MAPPING.LAST_UPDATE_LOGIN); 

ELSIF (EVENT_NAME = 'ON-UPDATE') THEN 

UPDATE XX_REC_MAPPING 
SET BRANCH_CODE=:XX_REC_MAPPING.OFFICE_CODE, 
COLLECTION_ID=:XX_REC_MAPPING.COLLECTION_ID, 
PAY_MODE_ID=:XX_REC_MAPPING.PAY_MODE_ID, 
RECEIPT_METHOD=:XX_REC_MAPPING.RECEIPT_METHOD, 
LAST_UPDATED_BY=:XX_REC_MAPPING.LAST_UPDATED_BY, 
LAST_UPDATE_DATE=:XX_REC_MAPPING.LAST_UPDATE_DATE, 
LAST_UPDATE_LOGIN=:XX_REC_MAPPING.LAST_UPDATE_LOGIN 
WHERE ROWID=:XX_REC_MAPPING.ROW_ID; 

END IF; 


END INSERT_ROW; 

END MAPPING; 

表是否被看着還是應該使用一些其他的觸發或循環?

請有人建議我如何編輯這個查詢多個更新?

感謝

sat33

+2

ON-INSERT和ON-UPDATE觸發器將爲塊中每個新的或修改的行自動調用,因此您不需要自己編寫任何循環。 – 2012-08-06 09:43:27

+0

我的問題是我查詢後無法更改表單欄中的記錄值。它保持相同的值,並顯示FRM:40654記錄已被另一個用戶查詢更改以查看更改 – sat33man 2012-08-07 06:19:05

回答

2

託尼是正確的。

您的塊基於視圖的行爲與塊基於表的行爲相同。 當此塊上的記錄被編輯時,會發生幾件事情。 :system.form_status將從QUERY變爲CHANGED。 每個更改的記錄都將:system.record_status設置爲CHANGED。

因此,當表單提交時 - Oracle表單自動知道它必須執行一些工作,因爲form_status已更改。然後它開始處理循環遍歷記錄的塊中的記錄,並處理每個record_status已更改的記錄。

如果您因爲您的塊基於視圖而超越了ON-INSERT和ON-UPDATE(您似乎是),那麼您所需要做的就是剪切並粘貼您的語句 INSERT INTO XX_REC_MAPPING ..... 插入塊級別的ON-INSERT觸發器中。這有效地覆蓋了形式會發射的插入物。

而且你也應該對你的更新做同樣的事情 - 只在塊級別將該語句剪切並粘貼到ON-UPDATE觸發器中。


FRM:40654記錄已被其他用戶再次查詢改爲看到 變化

出現此錯誤是由於在形成鎖定機制射擊。 該塊正試圖通過使用ROWID來鎖定該記錄。如果您在視圖上創建了塊,則不會有ROWID可用。

將塊上的KEY MODE設置爲不可更新應該解決此問題。

我也建議做一些關於KEY MODE屬性的閱讀,因爲這對於在JOINS和VIEWS上建立塊是很關鍵的。

+0

我的問題是我無法更改查詢後窗體列中的記錄值。它保持相同的值並顯示FRM:40654記錄已被其他用戶查詢修改以查看更改。 – sat33man 2012-08-07 06:18:39