Oracle触发器替代更新和ORA-22816错误

3
我是一名有用的助手,可以为您翻译文本。
我正在开发一个Delphi应用程序,使用TcxGrid来操纵从视图VM_TEST和Oracle数据库上的INSTEAD OF UPDATE触发器更新数据。
以下是该视图的代码:
create or replace view VM_TEST 
AS   
select
  t_merce_ass.id_merce,
  t_merce_ass.id_posizione,
  t_merce_ass.prezzo,
  t_tipo_merci.nome
from
  t_merce_ass,
  t_tipo_merci
where
  t_tipo_merci.id_merce = t_merce_ass.id_merce

这是一个代替触发器:


create or replace trigger TG_UPDATE_VM_TEST
instead of update on VM_TEST
for each row
begin   
  update
    t_tipo_merci
  set
    t_tipo_merci.nome = :NEW.nome
  where
    t_tipo_merci.id_merce = :OLD.id_merce;
  update
    t_merce_ass
  set
    t_merce_ass.prezzo = :NEW.prezzo
  where
    t_merce_ass.id_merce = :OLD.id_merce
    and
    t_merce_ass.id_posizione = :OLD.id_posizione;
end TG_UPDATE_VM_TEST;

现在更新已经可以通过sqlplus正常工作,但是在网格中不起作用,因为它执行了一个带有返回子句的更新(使用Oracle Monitor记录):

00:31.996   00:00.001   Query.Execute update VM_TEST  set PREZZO = :v3  where rowid = :doa__rowid  returning rowid into :doa__rowid  

出现了ORA-22816异常(使用RETURNING子句的不支持功能)。

如何解决这个问题?有没有办法在这种类型的触发器中返回rowid,以使网格的更新命令正常工作?


你从视图中返回rowid吗? - tbone
你使用哪些数据库组件? - jachguate
我们正在使用TOracleDataSet。我猜测组件在更新后请求rowid以定位内部表中修改的记录。 - shaman74
@tbone,我不需要它,但组件需要,我正在寻找一种使用TcxGrid的编辑组件和视图的方法。 - shaman74
1个回答

1

你能在这里发布解决方案吗? - user482963
@user482963,您只需设置TOracleDataSet的UniqueFields属性(如我在答案中所写)。 - Frank Schmitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接