2013-02-27 35 views
3

我工作的一个Delphi应用程序,使用TcxGrid从视图VM_TEST操作数据和INSTEAD OF UPDATE触发器上的Oracle数据库进行更新。Oracle触发器,而不是更新和ORA-22816错误

这是视图代码:

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以使网格的更新命令起作用?

+0

你从一个视图返回的ROWID? – tbone 2013-02-27 13:47:01

+0

你使用什么数据库组件? – jachguate 2013-02-27 15:26:49

+0

我们正在使用TOracleDataSet。我猜想组件在更新后请求rowid以在内部表中查找修改后的记录。 – shaman74 2013-02-27 15:58:13

回答