我有表格形式(显示4条记录)和一个数据块(基于视图)。
查询后,表单无法更新所有记录,但只有第一个记录值可以从LOV中选择。
我在on-insert和on-update上调用了一个过程。
查询是这样的:
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
答案 0 :(得分:2)
托尼是对的。
您的块基于视图的行为,就像块基于表一样。 编辑此块上的记录时,会发生一些事情。 :system.form_status将从QUERY变为CHANGED。 更改的每条记录都将:system.record_status设置为CHANGED。
因此,当提交表单时 - Oracle表单自动知道它必须做一些工作,因为form_status已更改。然后它开始处理块中的记录,循环遍历记录并处理记录变化的每个记录。
如果你因为你的块基于一个视图而超越了ON-INSERT和ON-UPDATE(你看起来像是) - 那么你需要做的就是剪切并粘贴你的语句 插入XX_REC_MAPPING ..... 进入块级的ON-INSERT触发器。这有效地覆盖了表格会被解雇的插入物。
您也应该为更新做同样的事情 - 只将该语句剪切并粘贴到块级别的ON-UPDATE触发器中。
FRM:40654记录已由另一个用户重新查询更改以查看 变化
由于表单中的LOCKING机制触发,会发生此错误。 该块正在尝试使用ROWID锁定记录。如果您在视图上设置了块,则不会有ROWID可用。
将块上的KEY MODE设置为不可更新应解决此问题。
我还建议对KEY MODE属性进行一些阅读,因为这对于在JOINS和VIEWS上建立块是至关重要的。