Je travaille sur un projet de base de données sur le système électoral national. Tout en casting, vote pour un certain candidat, je souhaite mettre à jour automatiquement TOTAL_VOTES +1 dans la table des résultats. Le total_votes de tous les candidats est initié à zéro. J'ai écrit une gâchette, mais cela ne fonctionne pas / je veux que la gâchette fonctionne em> / p> p> p>
3 Réponses :
Essayez ceci, il devrait fonctionner
CREATE OR REPLACE TRIGGER tvc
AFTER INSERT ON cast_vote
REFERENCING NEW AS newRow OLD AS oldRow
FOR EACH ROW
DECLARE
initialcnt number;
BEGIN
SELECT COUNT(*) INTO initialcnt FROM results;
IF(initialcnt=0) THEN
INSERT INTO results VALUES(:newRow.can_id,1);
ELSE
UPDATE results SET total_vote =(select max(total_vote) from
results where can_id=:newRow.can_id)+1 where can_id=:newRow.can_id;
END tvc;
Initialement, il n'y a pas de lignes dans les résultats test: p>
Si "total_votes de tous les candidats est initié à zéro" signifie qu'il y a une ligne pour chaque candidat avec un vote 0 Tally défini initialement alors les œuvres suivantes (presque ce que vous aviez): 1. Supprimer le déclarer, il inutile, ou inverse-le et "pour chaque rangée".
2. Changer: OLD.CAN_ID = R.CAN_ID; à: new.can_id = r.can_id; Dans un déclencheur d'insertion: Vieux n'existe pas (vous pouvez le faire référence, mais toutes les colonnes sont nuls).
S'il est possible que le total des votes ne soit pas initialisé, utilisez la fusion.
create or replace Trigger tvc
before insert
on cast_vote
for each row
begin
merge into results r
using (select :new.can_id newid from dual)
on (newid = r.id)
when matched then
update set total_vote = total_vote+1
when not matched then
insert (id,total_vote) values(newid,1);
end tvc;