SQL Oracle触发器

SQL Oracle触发器,sql,oracle,Sql,Oracle,我对简单的触发命令有问题。当在rit学习的人员插入表person时,此触发操作将在表address_rit中插入值。以下是触发器命令的语法: 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,

我对简单的触发命令有问题。当在rit学习的人员插入表person时,此触发操作将在表address_rit中插入值。以下是触发器命令的语法:

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

我很确定这个错误只是一个语法错误,但我就是找不到任何解决方案。如果我需要添加更多细节,请告诉我。非常感谢你的帮助

新建前至少需要一个冒号


我还假设对STATES表的查询总是返回正好一行。但是,如果数据库正确规范化,我希望所有表都有一个STATECODE列,而不是STATE列,并且PERSON和ADDRESS_RIT之间都有外键,它们引用STATECODE列。但是,如果数据库被正确地规范化,我还希望您不会有一个亲自复制数据的ADDRESS_RIT表。相反,ADDRESS\u RIT实际上应该是PERSON表上的一个视图。

问题在于您使用的是值,同时选择。。。但康拉德的答案是正确的。有关详细信息,请参阅。@Ben-您可以在INSERT中使用标量子查询。。。价值观声明。这有点奇怪,但它的语法是有效的。@JustinCave,你每天都会学到一些新东西…:-我一直认为这是违法的;虽然我不会经常这样做…非常感谢你的帮助:这很有效!问题在于新的约束机制。我读过几篇关于触发器的文章,对于如何使用新绑定感到困惑。谢谢!
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;
/