2012-02-24 8 views
-1

シンプルなトリガーコマンドに問題があります。このトリガ操作では、テーブルaddress_ritに値を挿入し、RITで勉強する人がテーブルに挿入されます。トリガーコマンドの構文は次のとおりです。SQL Oracle Trigger

CREATE OR REPLACE TRIGGER addr 
AFTER INSERT ON person 
FOR EACH ROW 
WHEN (NEW.college = 'RIT') 
BEGIN 
INSERT INTO address_rit (name, address, state) 
VALUES (NEW.name, NEW.address, (SELECT name FROM states WHERE NEW.statecode = states.statecode)); 
END; 
/

トリガーはコンパイルされますが、警告があります。しかし、さらに検査すると、実際にトリガにエラーがあることがわかります。コンパイルのエラーは次のとおりです。

PL/SQL: SQL Statement ignored ERROR 
PL/SQL: ORA-00984: column not allowed here ERROR 

エラーは構文エラーですが、解決策が見つかりません。私は詳細を追加する必要がある場合はお知らせください。ご助力ありがとうございます。最低で

+0

問題は、あなたが同時に 'values'と' select'を使っていることです...しかし、conradの答えが行く方法です。詳細は、['insert'構文](http://www.techonthenet.com/sql/insert.php)を見てください。 – Ben

+0

@Ben - 'INSERT ... VALUES'ステートメントにスカラーサブクエリを置くことができます。これはちょっと風変わりですが、有効な構文です。 –

+2

@JustinCave、よく毎日何か新しいことを学ぶ... :-)私はいつもそれが違法だと思った。私は頻繁にそれをやっていませんが... – Ben

答えて

2

は、私はまた、STATESテーブルに対するクエリは、常に正確に1行を返すために起こっていることを仮定していNEW

CREATE OR REPLACE TRIGGER addr 
    AFTER INSERT ON person 
    FOR EACH ROW 
    WHEN (NEW.college = 'RIT') 
BEGIN 
    INSERT INTO address_rit (name, address, state) 
    VALUES (:NEW.name, 
      :NEW.address, 
      (SELECT name 
       FROM states 
       WHERE :NEW.statecode = states.statecode)); 
END; 
/

前にコロンが必要です。しかし、データベースが適切に正規化されていれば、すべてのテーブルにSTATE列ではなくSTATECODE列があり、とADDRESS_RITの間にSTATECODE列を参照する外部キーがあると考えられます。STATESです。しかし、データベースが正常に正規化されている場合は、PERSONにデータを複製するADDRESS_RITテーブルを持たないことも期待します。代わりに、ADDRESS_RITは本当にPERSONテーブルのビューでなければなりません。

+0

それは動作します!問題はバインディングNEWです。私はトリガについていくつかの記事を読んできましたが、私はNEWバインディングの使い方を混乱させています。どうもありがとう! – vandershraaf