2012-02-24 177 views
-1

我遇到简单触发命令的问题。当在RIT学习的人插入表时,该触发操作将插入表address_rit中。以下是触发命令的语法:SQL Oracle触发器

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' ......但康拉德的答案是要走的路。查看['insert'语法](http://www.techonthenet.com/sql/insert.php)获取更多信息。 – Ben 2012-02-24 17:06:45

+0

@Ben - 你可以在'INSERT ... VALUES'语句中使用标量子查询。这有点古怪,但它是有效的语法。 – 2012-02-24 17:13:00

+2

@JustinCave,你每天都会学到新的东西...... :-)我一直认为这是非法的;虽然我不会经常这样做... – Ben 2012-02-24 17:14:53

回答

2

至少,你需要一个冒号前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; 
/

我也假设是对STATES表的查询总是要只返回1行。如果数据库正确归,不过,我希望所有的表将有一个STATECODE列,而不是一个STATE列,将有两个PERSONADDRESS_RITSTATES引用STATECODE柱之间的外键。但是,如果数据库已正确归一化,那么我也希望您不会有一个ADDRESS_RIT表格复制PERSON中的数据。相反,ADDRESS_RIT真的应该是PERSON表中的一个视图。

+0

这很有效!问题在于绑定NEW。我读过几篇关于触发器的文章,我对如何使用NEW绑定感到困惑。非常感谢! – vandershraaf 2012-02-24 17:25:36