Oracle Forms 10g,多次插入和更新不起作用
Posted
技术标签:
【中文标题】Oracle Forms 10g,多次插入和更新不起作用【英文标题】:Oracle forms 10g,multiple insert and update not working 【发布时间】:2012-08-06 06:54:46 【问题描述】:我有一个数据块(基于视图)的表格形式(显示 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
【问题讨论】:
ON-INSERT 和 ON-UPDATE 触发器将自动为块中的每个新行或修改行调用,因此您无需自己编写任何循环。 我的问题是查询后我无法更改表单列中的记录值。它保持相同的值并显示 FRM:40654 记录已被另一个用户重新查询以查看更改 【参考方案1】:托尼是正确的。
您的块基于视图的行为与该块基于表的行为一样。 当编辑此块上的记录时,会发生几件事。 :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 的块至关重要。
【讨论】:
我的问题是查询后我无法更改表单列中的记录值。它保持相同的值并显示 FRM:40654 记录已被另一个用户重新查询以查看更改。跨度>以上是关于Oracle Forms 10g,多次插入和更新不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Oracle Forms 10g Tutorial Ebook Download - Oracle Forms Blog