Oracle: à l'Aide de sous-requêtes dans un déclencheur
Comment puis-je contourner l'Oracle de la limite de ne pas permettre les sous-requêtes dans les déclencheurs.
Voici un exemple de déclenchement je suis en train de créer, mais je suis incapable parce que je ne peux pas utiliser une sous-requête.
CREATE OR REPLACE TRIGGER trigger_w_subquery
AFTER UPDATE OR INSERT ON project_archiving
FOR EACH ROW WHEN (old.archiving_status <> new.archiving_status
AND new.archiving_status = 1
AND (SELECT offer FROM projects WHERE projnum = :new.projnum) IS NULL
)
BEGIN
INSERT INTO offer_log (offer, status, date)
VALUES (null, 9, sysdate);
END;
OriginalL'auteur vipirtti | 2009-05-26
Vous devez vous connecter pour publier un commentaire.
Ce déclencheur serait-il le faire:
J'ai supposé que la sélection à partir des projets trouverez toujours une ligne; si non, elle va soulever une NO_DATA_FOUND exception que vous pourriez avoir besoin pour gérer.
Juste un avertissement, si vous utilisez multi-inserts de tableau (insertion dans le projet et le project_archiving), vous pouvez vous retrouver avec une mutation erreur de table. En tant que tel, il est préférable de mettre de la logique où l'insert d'origine est, plutôt que de s'appuyer sur un déclencheur.
OriginalL'auteur Tony Andrews
J'attends que vous voulez quelque chose comme
OriginalL'auteur Justin Cave
Pouvez-vous mettre de l'état dans l'action (entre début et FIN) au lieu de dans le "s'il feux"? Oui, cela signifie que la détente du corps peut être déclenché plus souvent - mais si ça vous permet de vous déplacer le problème...
Tenté de COMMENCER SI (SÉLECTIONNEZ offre DE projets OÙ projnum = :new.projnum) EST NULLE, PUIS INSÉREZ-la DANS etc. Cependant, il Oracle renvoie une erreur comme il encounteres le SÉLECTIONNER dans cette déclaration. Il n'a tout simplement pas attendre.
Je ne suis pas suffisamment familier avec PL/SQL pour savoir si c'est une façon plausible d'écrire le code dans le déclencheur. Il semble bon; d'autres systèmes que je connais aurait besoin d'un peu de tri de la cession de la SÉLECTIONNER (avec une clause INTO et une variable), et de vérifier ensuite la variable, ou quelque chose le long de ces lignes. Il y a probablement une description des limites de déclencheurs manuels. Aussi, pouvez - vous appeler une procédure dans l'action? Si oui, peut-être qui va travailler pour vous? (Transmettre les valeurs pertinentes en tant que paramètres.)
OriginalL'auteur Jonathan Leffler