Comment puis-je entrer la valeur dans la colonne Je voudrais avoir une gâchette ou une procédure pour l'automatiser. Lorsque je saisi les valeurs dans les colonnes, il déclenche automatiquement la gâchette, ce faisant ce calcul et insérant le résultat dans la colonne Je voudrais aussi automatiser le Colonne pouvez-vous m'aider? P> line_total code> qui serait faite par le compte (
sale_line.line_total = product.unit_price * sale_line.line_qty code>)?
sale_line.line_total code>. P>
vente.sale_total code> qui serait la somme de la colonne Valeurs
sale_line.line_total code>. Pouvez-vous faire une gâchette ou une procédure pour ces deux questions? P>
CREATE OR REPLACE TRIGGER trg_line_total_ai AFTER INSERT OR UPDATE ON sales_line
FOR EACH ROW
DECLARE
lt_value NUMBER(7,2);
BEGIN
SELECT product.unit_price INTO lt_value FROM product;
UPDATE sales_line
SET line_total = :NEW.line_qty * lt_value
-- SET line_total = (line_qty * :NEW.unit_price)
WHERE product_id = :NEW.product_id;
--UPDATE sales_line
-- SET line_total = (line_qty * :OLD.unit_price)
--WHERE product.product_id = :OLD.product_id;
END;
CREATE OR REPLACE TRIGGER trg_sale_total_ai AFTER INSERT OR UPDATE ON sales_line
FOR EACH ROW
BEGIN
UPDATE sale
SET sale_total = (sale_total + :NEW.line_total)
WHERE sale_id = :NEW.sale_id;
UPDATE sale
SET sale_total = (sale_total + :OLD.line_total)
WHERE sale_id = :OLD.sale_id;
END;
3 Réponses :
Pour mettre à jour Sale_Line, vous devez utiliser A avant déclencheur, puis la mise à jour n'est pas nécessaire pour ce tableau. Seule la valeur ascendante à: new.line_total. Pour mettre à jour la vente, vous pouvez le faire dans la gâchette Dame. p>
Merci de répondre, mais je n'ai pas compris ce que signifie. Pouvez-vous me montrer s'il vous plaît? Merci
Utilisez le code suivant à la place. Veuillez noter le mot-clé "avant" au lieu d'après dans les deux définitions de déclencheurs
Vous avez deux problèmes majeurs. Le premier (comme indiqué dans d'autres réponses) est que le premier déclencheur doit être un avant la gâchette em> qui modifie les enregistrements en place. La logique de la gâchette peut également être simplifiée (comme ci-dessous) la seconde question est que vous devriez être soustraire em> les valeurs code> anciennes code> dans le deuxième déclencheur. Donc: p> Notez que le second déclencheur a deux mises à jour. Cela permet au Sale_id code> à mettre à jour. Vous pouvez em> enveloppez-le dans une seule mise à jour si vous le souhaitez: p>
UPDATE sale
SET sale_total = (sale_total +
(CASE WHEN sale_id = :NEW.sale_id THEN :NEW.line_total ELSE 0 END) -
(CASE WHEN sale_id = :OLD.sale_id THEN :OLD.line_total ELSE 0 END)
)
WHERE sale_id IN (:OLD.sale_id, :NEW.sale_id);
Insertion dans Sales_Line (Sale_ID, Product_ID, Line_qty, Line_Total) Valeurs (2, 24, 1, 0) Rapport d'erreur - Erreur SQL: ORA-04098: ORA-04098: TRGGER 'System.TOTAL_TRG_LINE_TOTAL_BIU' est invalide et échoué à la validation 04098. 00000 - " déclencheur '% s.% s' est invalide et échoué la ré-validation "* Cause: Un déclencheur a été tenté d'être récupéré pour l'exécution et qu'il était jugé invalide. Cela signifie également que la compilation / autorisation a échoué pour la gâchette. * Action: les options doivent résoudre les erreurs de compilation / autorisation, désactivez la gâchette ou déposez la gâchette.
Merci tout le monde et Gordon Linff pour m'aider. J'ai essayé, mais cela renvoie cette erreur. Je suis nouveau ici. Donc, désolé pour des erreurs. Pouvez-vous me dire comment résoudre cette erreur? Bonne année. Je suis essayé faire ça depuis quelques jours.
@Dviga. . . Aucun de ces déclencheurs n'est appelé trg_line_total_biu code>. Cette erreur peut se produire lorsque les requêtes de la gâchette ne peuvent pas être recompantées - souvent à cause d'une erreur dans une colonne ou un nom de table. Vous devez vérifier les requêtes pour être sûr qu'ils sont corrects. Ils ont l'air correct.
APC et @gordon Linoff que j'ai fait exactement comme Gordon, et j'ai vérifié et que l'erreur est la même. Et j'ai enlevé la mise à jour et mis avant plutôt après. Pourrait être, quelque chose sur la vente_id et le produit_id dans la table Sales_Line Be (PF) - Touches composites? Parce que je ne comprends pas où l'erreur je viens de mettre le code insert: insérer dans des valeurs Sales_Line (Sale_ID, Product_ID, Line_qty, Line_Total) (2, 24, 1, 0). Pouvez-vous m'aider à m'aider s'il vous plaît? Je mettez les tables ci-dessus, de sorte que les noms de colonne et la configuration sont corrects avec le code d'insertion.
@Dviga. . . Malheureusement, les sites en ligne qui permettent des tests de code ne semblent pas fonctionner pour Oracle SQL avec des déclencheurs. Cela rend difficile de comprendre ce qui se passe. Je me demande s'il existe une sorte de problème d'autorisations lors de la revalidation de la gâchette.
Désolé gars maintenant ça marche. Je pense que l'erreur était parce que je n'avais aucune mise à jour ni commis, je ne sais pas. Je viens de supprimer tout et de mettre à nouveau. Et aller. Merci gars, maintenant je vais tester les 3 déclencheurs. Guys @gordon Linoff b> et APC B>. Tu es le meilleur. Merci beaucoup, je suis très heureux, parce que j'ai été essayé et à chercher de nombreux endroits et que vous m'avez aidé beaucoup. Je me sentais déjà mal essayé. Et c'est grave. Vous avez vraiment beaucoup aidé beaucoup et je n'ai pas de mots pour vous remercier de m'aider! ** Mais la vente de colonne.sale_total est null. le déclencheur no mis à jour avec l'équation **.
Dans le second déclencheur, pas besoin d'une équation comme ceci: Sale.sale_total = (Sales_Line.line_qty + Sales_Line.line_Total)? @Gordon Linoff et APC. Étant donné que la valeur totale de la table de vente est la somme de la ligne_qty + line_total dans la table Sales_Line. Le premier déclencheur fonctionne bien
Je mets ici @APC. Les 2 commentaires ci-dessus.
J'ai essayé de faire cela dans le deuxième déclencheur: Créer ou remplacer la trigger Trg3ale_Total_ai après l'insertion ou la mise à jour sur Sales_Line pour chaque ligne de mise à jour Sale de vente Sale_total = (Sale_Total +: NEW.LINE_TOTAL); FINIR; Dans la première ligne travaillée, mais plus dans les autres dans la table de vente. Pouvez-vous me dire pourquoi? Merci @gordon Linoff
Stocker les totaux va normalement à l'encontre de toutes les "règles" de normalisation »