Sql Oracle给定错误中的触发器

Sql Oracle给定错误中的触发器,sql,oracle,triggers,Sql,Oracle,Triggers,这是我的sql代码: CREATE OR REPLACE TRIGGER PLACE_NO_TRIGGER BEFORE INSERT or UPDATE ON UHA_LEASE FOR EACH ROW BEGIN INSERT INTO UHA_TEMPVAL SELECT PLACE_NO FROM UHA_RESHALL; INSERT INTO UHA_TEMPVAL SELECT PLACE_NO FROM UHA_GENERAL; IF(:NEW.PLACE_NO

这是我的sql代码:

CREATE OR REPLACE TRIGGER PLACE_NO_TRIGGER
BEFORE INSERT or UPDATE ON UHA_LEASE
FOR EACH ROW BEGIN
  INSERT INTO UHA_TEMPVAL SELECT PLACE_NO FROM UHA_RESHALL; 
  INSERT INTO UHA_TEMPVAL SELECT PLACE_NO FROM UHA_GENERAL;
  IF(:NEW.PLACE_NO NOT IN UHA_TEMPVAL.TEMP_VALUE AND :NEW.PLACE_NO IS NOT NULL) THEN
    RAISE_APPLICATION_ERROR(-10001, 'PLACE_NO MUST BE IN UHA_RESHALL OR IN UHA_GENERAL OR NULL');
  END IF;
  DELETE FROM UHA_TEMPVAL;
END;
这就产生了以下错误:

Error(4,27): PLS-00103: Encountered the symbol "UHA_TEMPVAL" when expecting one of the following:     ( The symbol "(" was substituted for "UHA_TEMPVAL" to continue. 
Error(4,69): PLS-00103: Encountered the symbol "THEN" when expecting one of the following:     ) , and or as The symbol ")" was substituted for "THEN" to continue. 
有人能帮我理解为什么会发生这些错误吗?这特别奇怪,因为第4行在第60列结束


谢谢

看起来您试图将引用完整性从一个子表强制到两个父表中的任何一个。您实际上不需要插入和删除临时表;您可以计算两个表中匹配的行数:

CREATE OR REPLACE TRIGGER PLACE_NO_TRIGGER
BEFORE INSERT or UPDATE ON UHA_LEASE
FOR EACH ROW
DECLARE
  CNT NUMBER;
BEGIN
  SELECT COUNT(*)
  INTO CNT
  FROM (
    SELECT PLACE_NO FROM UHA_RESHALL
    WHERE PLACE_NO = :NEW.PLACE_NO
    UNION ALL
    SELECT PLACE_NO FROM UHA_GENERAL
    WHERE PLACE_NO = :NEW.PLACE_NO
  );

  IF :NEW.PLACE_NO IS NOT NULL AND CNT = 0 THEN
    RAISE_APPLICATION_ERROR(-10001,
      'PLACE_NO MUST BE IN UHA_RESHALL OR IN UHA_GENERAL OR NULL');
  END IF;
END;
/

如果
:NEW.PLACE\u NO
不为空,则可以选择仅运行查询,但如果列被索引,则可能不会有太大区别。

验证表“UHA\u TEMPVAL”是否存在:
从dba\u对象中选择*,其中对象名称='UHA\u TEMPVAL'另外,不确定您在做什么,但使用触发器在其他表中填充值并不是推荐的使用触发器的方法(啊,等等,我的错。我以为它在插入时出错了……看起来它在IF上失败了……你不能这样做:
UHA_TEMPVAL.TEMP_VALUE
你不能像变量一样访问表值。你需要先将它存储到变量中。