【发布时间】:2017-10-14 19:15:07
【问题描述】:
我正在为大学做这个练习,我已经被困了一个星期。我需要创建一个触发器,以便在更改表“tbvale”上的状态列时,相应地在“tbfuncionario”列上发生一些更新。 我意识到我的代码可能看起来很麻烦,甚至可能不合适,但它是一个旨在教授特定事物的单一练习。 到目前为止,这就是我想出的:
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 语句中添加 where 子句。
-
这些查询必须返回单行:
SELECT valorvale INTO vv FROM tbvale;SELECT fkcodmat INTO cod FROM tbvale; -
"'我已经卡了一个星期" 如果你自己运行
SELECT valorvale FROM tbvale;,你可以节省六天二十三小时五十九天的卡住。 `