3

我正在开发一个 Delphi 应用程序,使用 TcxGrid 来操作来自视图 VM_TEST 的数据和 Oracle DB 上的 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异常 ( Unsupported feature with RETURNING clause)。

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

4

1 回答 1

1

根据Direct Oracle Access 论坛(搜索 ORA-22816),您可能必须设置 UniqueFields 属性。

于 2013-02-28T08:02:44.040 回答