2010-12-05 10 views
1

2つの属性、シート番号およびシート・クラスを使用して、表(トリガー)と呼ばれる表にトリガーを作成したいとします。座席が50と言うよりも高い場合、クラスは「高」でなければなりません。そうでなければ「低」でなければなりません。私は数字を入力すると自動的にクラスを与えるトリガーが欲しい!Oracle SQL:単純なトリガーif節の値の変更に影響する問題

だけでなく、いくつかの交互を試してみました、私が今まで持っているものを参照してください。..

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;/

私は、データベースのコーディングに非常に新しいです、そう...任意のヘルプは素晴らしいだろう!

答えて

3

変更 "=" と ":="、新しい行に "前" "後" の変化、および "> 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; 
/
別に、既に述べたjonearles構文問題から
+0

文句は申し訳ありませんが、遅れていました。私は愚かな方法で前のイベントトリガーのisteadを使用していた! Thanx – Derp

3

あなただけのトリガーで遊んでいる(またはこれは宿題のいくつかの種類である)場合を除き、これは非常に良いデザインではありません。

リレーショナルデータベースのルールの1つは、既存のデータから派生できる情報を格納しないことです。あなたも、検索時に自動的に「計算」を行います仮想列を定義することができますOracleの11で

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

あなたは簡単にそれを格納する必要がない、選択の際にCLASS_CODEを選択することができますそうでなければ、その情報を返すビューを定義できます。

+0

良い点。また、コードがnull値を正しく処理するかどうかは疑問です。結果のclass_codeは実際にはそのケースで「低」か、それともnullであるべきですか? –

+0

一般的な設計問題として解決する最も適切な方法はクエリを使用しますが、値を保存する必要があります。 – Derp