Oracle触发而不是更新和ORA-22816错误

时间:2013-02-27 11:34:59

标签: sql oracle delphi view triggers

我正在开发一个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但它不能与网格一起使用,因为它使用returns子句执行更新(使用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以使网格的更新命令有效?

1 个答案:

答案 0 :(得分:1)

根据Direct Oracle Access forum(搜索ORA-22816),您可能需要设置UniqueFields属性。