0

我有一个数据块(基于视图)的表格形式(显示 4 条记录)。

查询后,表单无法更新所有记录,但只能从 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;

是否要查看表格还是应该使用其他触发器或循环?

请有人向我建议如何编辑此查询以进行多次更新?

谢谢

卫星33

4

1 回答 1

2

托尼是对的。

您的块基于视图的行为就像块基于表一样。当编辑此块上的记录时,会发生几件事。:system.form_status 将从 QUERY 变为 CHANGED。每条被更改的记录都会将 :system.record_status 设置为 CHANGED。

因此,当提交表单时——Oracle 表单自动知道它必须做一些工作,因为 form_status 已更改。然后它开始处理块中的记录,循环遍历记录并处理每个记录状态为更改的记录。

如果您因为您的块基于视图而覆盖 ON-INSERT 和 ON-UPDATE(您似乎是),那么您需要做的就是剪切并粘贴您的语句 INSERT INTO XX_REC_MAPPING ... .. 进入块级的 ON-INSERT 触发器。这有效地覆盖了表单会触发的插入。

您也应该对更新执行相同的操作 - 只需将该语句剪切并粘贴到块级别的 ON-UPDATE 触发器中。


FRM:40654 记录已被另一个用户重新查询以查看更改

发生此错误是由于在表单中触发了 LOCKING 机制。该块正在尝试使用 ROWID 锁定记录。如果您将块基于视图,则没有可用的 ROWID。

将块上的 KEY MODE 设置为不可更新应该可以解决此问题。

我还建议对 KEY MODE 属性进行一些阅读,因为这对于基于 JOINS 和 VIEWS 的块至关重要。

于 2012-08-06T11:07:46.040 回答