Je fais cet exercice pour l'université et je suis bloqué depuis une semaine. J'ai besoin de créer un déclencheur de sorte que lorsque la colonne d'état sur la table "tbvale" est modifiée, quelques mises à jour se produisent sur la colonne "tbfuncionario" en conséquence. Je me rends compte que mon code semble probablement lourd et même inapproprié, mais c'est un exercice uni conçu pour enseigner des choses spécifiques. C'est ce que je suis venu avec à ce jour:Déclencheur Oracle PL/SQL qui met à jour une table différente
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 est le PK de tbfuncionario et fkcodmat est le FK de pkcodmat référencement de tbvale.
Actuellement quand je lance
UPDATE tbvale SET STATUS = 2 WHERE PKCODVALE = 3;
Je reçois l'erreur suivante:
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
Je ne comprends pas pourquoi il serait « retour plus que le nombre requis de lignes » comme il n'y a qu'un seul row où pkcodmat est égal à fkcodmat.
J'apprécie tout aperçu de la raison pour laquelle cela se produit et comment je pourrais le réparer.
ajouter une clause where aux instructions select dans le corps de la détente. – DwB
Ces requêtes doivent renvoyer une seule ligne: 'SELECT VALEURALE INTO vv FROM tbvale;' 'SELECT fkcodmat DANS LA morue FROM tbvale;' – L30n1d45
"'Je suis resté bloqué pendant une semaine" Si vous aviez lancé 'SELECT valorvale FROM tbvale;' sur son possédez vous pourriez vous avoir sauvé six jours, vingt-trois heures et cinquante-neuf jours de coincement. ' – APC