【问题标题】:Oracle Trigger: update table2 after inserting on table 1Oracle 触发器:在表 1 上插入后更新表 2
【发布时间】:2013-11-22 17:50:37
【问题描述】:

我有以下触发器,但它不起作用,我没有收到任何错误,它根本不起作用。

CREATE OR REPLACE TRIGGER PROYECTO.ACTUALIZAPRECIOSTOTALFACTURA
AFTER INSERT
ON PROYECTO.DOCUMENTOS_DETALLE
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
BEGIN
    update DOCUMENTOS
    set doc_total=doc_total+:new.doc_det_precio
    where doc_numero = :new.doc_numero;
END;

如果我删除“where”条件,它确实有效,但不是我需要的方式(它在 documentos.doc_total 上添加 doc_det_precio,但总是在我在 DOCUMENTOS 表上的第一条记录中。我应该做什么错了吗?

表格是:
文档
DOC_numero
DOC_total

DOCUMENTOS_DETALLE
DOC_DET_id
DOC_numero
DOC_DET_precio

【问题讨论】:

    标签: oracle triggers sql-update where-clause sql-insert


    【解决方案1】:

    你的where 子句应该是:

    where doc_numero = :new.doc_det_doc_numero;
    

    您可能还想重新考虑尝试在主表上保持总和是最新的。它很容易失去同步。通常在需要时只计算总数更合适:

    select m.doc_numero
          ,sum(d.doc_det_precio) as doc_total
      from documentos m
      join documentos_detalle d on (d.doc_numero = m.doc_numero)
      group by m.doc_numero
    

    【讨论】:

    • 抱歉,两个表中的两个字段的名称相同,我刚刚编辑了问题。您认为这会影响结果吗?
    • 这不是架构问题,是吗?您正在运行 PROYECTO 架构中的所有内容?否则您可能不会更新您认为的表(因为DOCUMENTOS 没有以架构为前缀。我会删除所有架构引用。并且您在 DOCUMENTOS.DOC_numero 上有主键,在 DOCUMENTOS_DETALLE.DOC_numero 上有一个外键?跨度>
    • 嗨格伦。感谢您的回答。关于原始问题,这不是架构问题,我尝试使用和不使用架构前缀(所有表)运行,但没有。是的,DOCUMENTOS.Doc_numero 是 DOCUMENTOS_DETALLE.Doc_numero 上的 FK。奇怪的是我的代码在没有 WHERE 条件的情况下工作,我真的很想知道我做错了什么。我还尝试了您的第一个脚本(选择)并且它可以工作,现在我正在尝试将其放在触发器上,我真的需要按照我最初尝试的方式进行操作。
    • 它看起来也很适合我。我刚刚在 sqlfiddle 上尝试过。看这里:sqlfiddle.com/#!4/57905/1
    • 它创建好了,但它根本没有做任何事情。现在,如果尝试执行您的 SELECT 和 SUM 代码,我正在尝试使用触发器执行此操作,我收到错误“DOCUMENTOS 不能用作选择语句的目标”。我的代码是:在插入 DOCUMENTOS_DETALLE 后创建或替换触发器 ACTUALIZAPRECIOSTOTALFACTURA 将新旧作为旧的每行开始选择 (sum(DOC_DET_PRECIO)) INTO DOCUMENTOS from documentos_detalle join documentos on (documentos.DOC_NUMERO=documentos_detalle.DOC_NUMERO);结束;
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2017-06-26
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多