更新不同表的 Oracle PL/SQL 触发器

法老

我正在为大学做这个练习,我已经被困了一个星期。我需要创建一个触发器,以便当表“tbvale”上的状态列更改时,相应地在“tbfuncionario”列上发生一些更新。我意识到我的代码可能看起来很麻烦,甚至可能不合适,但它是一个旨在教授特定事物的 uni 练习。这就是我到目前为止的想法:

CREATE OR REPLACE TRIGGER status_chg
AFTER UPDATE OF status ON tbvale
FOR EACH ROW
DECLARE
    nvd tbfuncionario.numvalesdescontados%type;
    nva tbfuncionario.numvalesaberto%type;
    vtva tbfuncionario.valortotalvalesaberto%type;
    nve tbfuncionario.numvalesemitidos%type;
    vv tbvale.valorvale%type;
    cod tbvale.fkcodmat%type;
    pragma autonomous_transaction;
BEGIN
    IF (:NEW.status <> :OLD.status) THEN
        SELECT valorvale INTO vv FROM tbvale;
        SELECT fkcodmat INTO cod FROM tbvale;
        IF (:NEW.status = 2) THEN
            nvd := 1;
            nva := -1;
            nve := 0;
            vv := vv - 1;
        ELSE
            nvd := 0;
            nve := 1;
            nva := 1;
            vv := vv + 1;
        END IF;
        UPDATE tbfuncionario
        SET numvalesdescontados = numvalesdescontados + nvd,
            numvalesaberto = numvalesaberto + nva,
            numvalesemitidos = numvalesemitidos + nve,
            valortotalvalesaberto = valortotalvalesaberto + vv
        WHERE pkcodmat = cod;
    END IF;
END;

pkcodmat 是 tbfuncionario 的 PK,fkcodmat 是 tbvale 引用 pkcodmat 的 FK。

目前当我跑步时

UPDATE tbvale SET STATUS = 2 WHERE PKCODVALE = 3;

我收到以下错误:

ERROR: ORA-01422: exact fetch returns more than requested 
number of rows ORA-06512: at "ULBRA.STATUS_CHG", line 11 
ORA-04088: error during execution of trigger 'ULBRA.STATUS_CHG' 

Error Code: 1422

Query = UPDATE tbvale SET STATUS = 2 WHERE PKCODVALE = 3

我不明白为什么它会“返回超过请求的行数”,因为只有一行 pkcodmat 等于 fkcodmat。

我很欣赏有关为什么会发生这种情况以及如何解决它的任何见解。

托尼·安德鲁斯

您不需要这些导致异常的查询:

SELECT valorvale INTO vv FROM tbvale;
SELECT fkcodmat INTO cod FROM tbvale;

假设您希望tbvale更新行中的值,请根据需要使用:old:new记录,例如

vv := :new.valorvalue;
cod := :new.fkcodmat;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PLSQL触发器-根据选择查询更新记录

来自分类Dev

PLSQL触发器在插入后更新记录

来自分类Dev

plsql在“ before alter”触发器中获取表

来自分类Dev

oracle触发器选择更新的行

来自分类Dev

Oracle触发器不会更新

来自分类Dev

Oracle更新触发器问题

来自分类Dev

Oracle触发器-根据表A的条件更新表B

来自分类Dev

同一表上的 Oracle 更新触发器

来自分类Dev

Oracle使用表触发器在触发器内部合并

来自分类Dev

Oracle触发器创建-表正在变异;触发器可能无法读取或修改

来自分类Dev

ORACLE在触发器中以1对多表关系更新记录

来自分类Dev

更新Oracle触发器之前的问题[PL / SQL]

来自分类Dev

具有Where子句的Oracle触发器更新

来自分类Dev

如何在Oracle中更新触发器

来自分类Dev

Oracle-在触发器中获取突变表异常?

来自分类Dev

如何使用触发器在Oracle中创建镜像表?

来自分类Dev

具有两个表的Oracle触发器

来自分类Dev

Oracle触发器不允许在表上插入

来自分类Dev

Oracle DB:删除表(DDL)触发器

来自分类Dev

Oracle触发器根据更新列的数据更新表的所有行

来自分类Dev

限制列char触发器plsql

来自分类Dev

PLSQL触发器编译错误

来自分类Dev

Oracle触发器插入/更新到另一个表

来自分类Dev

Oracle触发器实现

来自分类Dev

Oracle SQL触发器

来自分类Dev

Oracle - 触发器错误

来自分类Dev

sql触发器更新不同表的列

来自分类Dev

通过触发器在Oracle 11g更新后更新值

来自分类Dev

ORACLE SQL-无法获取触发器来从正在更新的表中获取值的总和/计数