Oracle表示10g,多次插入和更新无法正常工作

时间:2012-08-06 06:54:47

标签: sql oracle plsql oracle10g oracleforms

我有表格形式(显示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

1 个答案:

答案 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上建立块是至关重要的。