2010-12-05 36 views
1

Je souhaite créer un déclencheur dans une table (appelée siège) avec deux attributs, le numéro de siège et la classe de siège. Si le siège est plus élevé que 50, la classe devrait être "haute", sinon elle devrait être "basse". Je veux que le déclencheur donne automatiquement la classe quand j'entre un nombre!Oracle SQL: déclencheur simple Problème affectant le changement de valeurs dans la clause if

voir ce que j'ai jusqu'à présent, essayé quelques remplaçants et ..

CREATE TRIGGER trigger_class 
AFTER INSERT OR UPDATE ON seat 
FOR EACH ROW 
BEGIN 
IF :NEW.seat_no <=50 THEN :NEW.class_code ='high'; 
ELSE :NEW.class_code = 'low'; 
END IF; 
END;/

Je suis très nouveau dans le codage de base de données, ... toute aide serait génial!

Répondre

3

Change "=" à ": =", mettre le "/" sur une nouvelle ligne, le changement "APRÈS" à "AVANT", et le changement "< = 50" à "> 50":

CREATE OR REPLACE TRIGGER trigger_class 
BEFORE INSERT OR UPDATE ON seat 
FOR EACH ROW 
BEGIN 
IF :NEW.seat_no > 50 THEN :NEW.class_code :='high'; 
ELSE :NEW.class_code := 'low'; 
END IF; 
END; 
/
+0

Désolé pour la syntaxe, c'était en retard! J'utilisais le déclencheur d'événement Aftertead d'avant d'une manière stupide! Thanx – Derp

3

Outre les problèmes de syntaxe qui jonearles déjà décrit:

Sauf si vous êtes juste jouer avec les déclencheurs (ou cela est une sorte de devoirs), ce n'est pas une très bonne conception.

Une règle dans les bases de données relationnelles est que vous ne devez pas stocker d'informations pouvant être dérivées de données existantes.

Vous pouvez facilement sélectionner le CLASS_CODE lors d'une sélection, il n'y a pas besoin de le stocker:

 
SELECT seat_no, 
     CASE 
     WHEN seat_no > 50 THEN 'high' 
     ELSE 'low' 
     END as class_code 
FROM seat; 

Avec Oracle 11 vous pouvez même définir une colonne virtuelle qui fera automatiquement le « calcul » lors de la récupération, Sinon, vous pouvez définir une vue qui renverra cette information.

+0

Bon point. En outre, je me demande si le code gère correctement les valeurs nulles - le code de classe résultant devrait-il être «bas» dans ce cas, ou devrait-il être nul? –

+0

L'utilisation d'une requête est la méthode la plus appropriée pour la résoudre en tant que problème de conception général, mais je dois stocker la valeur! – Derp