2011-03-04 2 views
-1
CREATE TRIGGER update_orderline 

AFTER INSERT OR UPDATE ON ORDERS 

FOR EACH ROW 

BEGIN 

    INSERT INTO ORDERLINE(orderline_no, qty, order_no, product_no) 

    VALUES (ol_no.nextval, :new.qty, :new.order_no, :new.product_no); 

END; 

Je suis en train de créer un déclencheur qui met à jour orderline table après un nouveau record a été inséré dans les commandes. Mais j'obtiens cette erreur:Trigger de mettre à jour une autre table

Error(3,26): PLS-00049: bad bind variable 'NEW.QTY' 

Error(3,51): PLS-00049: bad bind variable 'NEW.PRODUCT_NO' 
+0

Pouvez-vous nous donner la structure de la table ORDERS? et ORDERLINE? – Xavinou

+0

@ Xavinou: order_no, employee_no, branch_no, commande_date, ship_date, shipping_method, tax_status, sous-total, tax_amt, shipping_charge, total_amt, customer_no – tbrown

+0

Pouvez-vous expliquer la logique métier. D'où vient la quantité? Vous pourriez être mieux avec une procédure stockée qui encapsulé l'insertion/mises à jour de commande et order_line –

Répondre

0

Je pense que j'ai trouvé.

Regardez ici: http://www.tek-tips.com/viewthread.cfm?qid=1556226&page=14

You have inadvertently discovered why, in the "Oracle World" it is generally bad form to code user-defined names within double quotes. You see, whenever you define a name in Oracle using double quotes and any alpha character that is not UPPER CASE, then you must always use double quotes and the same mixed-case configuration. If you do not use double-quotes, then Oracle presumes that regardless of your case in the code, that your Oracle name is uppercase !

So, when your referred, in your code, to "...INTO :new.user_idx...", Oracle looks for "USER_IDX", which it cannot find, since you defined that column as *"user_idx"* -- "user_idx" <> "USER_IDX".

If you sanitize your code of all double quotes, then your problem(s) should disappear.

+0

@ Xavinou: Merci, mais les guillemets n'est pas le problème dans mon cas. J'ai vérifié mes scripts de création pour être sûr. :( – tbrown

1

Si je devais deviner la table des commandes n'a pas des colonnes nommées « Numéro commande » et « no_produit ». Je peux reproduire l'erreur dans ce cas et obtenir le message de variable de liaison. Alors, quels sont les noms des colonnes de la table des ordres? MISE À JOUR: il n'y a rien pour obtenir la nouvelle valeur de order_no ou product_no ou d'ailleurs qty selon votre commentaire. D'où voulez-vous que les valeurs viennent?

MISE À JOUR: accordin à votre mise à jour vous avez les colonnes suivantes dans la table des commandes:

order_no,
employee_no,
branch_no,
order_date,
ship_date,
shipping_method,
tax_status,
subtotal,
tax_amt,
shipping_charge,
total_amt,
customer_no

Dans cette liste de colonnes, je ne vois pas no_produit ou Cdt. Order_no est là cependant.

+0

@ jschoen: Je pensais que les nouvelles valeurs seraient celles insérées dans la table des commandes, par exemple, si une nouvelle ligne est insérée dans les ordres, alors le trigger est censé mettre à jour la ligne de commande Donc, le nouvel enregistrement aura aussi le numéro de produit et la quantité – tbrown

+0

@ jschoen: Oups, vous avez raison, il n'y a pas product_no Donc, cela signifie que le product_no doit provenir de la table – tbrown

+0

@tbrown Peut-être que vous faites cela Peut-être votre table de lignes de commande devrait-elle avoir un déclencheur, qui insèrerait ou mettrait à jour la table de commande quand elle est mise à jour, probablement pas, mais vous devrez probablement déplacer ce type de fonction dans votre ode de logique applicative. –

Questions connexes