如何在Oracle SQL中的两个表之间使用触发器?

时间:2015-12-22 17:48:40

标签: oracle triggers oracle-sqldeveloper

想象一下这两个表

CREATE TABLE A
(
    idA       smallint primary key,
    idP       smallint ,
    ...
);

CREATE TABLE P
(
    idP       smallint primary key,
    Type      char , (ex:A, B, C)
    ...
);

我想表现得如果在表A中没有与表P中相同的类型,例如不是工人

CREATE OR REPLACE TRIGGER VERIFYTYPE 
BEFORE INSERT OR UPDATE ON A 
FOR EACH ROW
BEGIN
    IF((SELECT tp.Type
      FROM P tp
      WHERE tp.idP=:new.idP)!='W')
      THEN RAISE_APPLICATION_ERROR(-20001, 'That is not a worker');
    END IF;
END;  

我相信有些不对劲

2 个答案:

答案 0 :(得分:1)

在PL / SQL中,您需要选择一个变量。但是gmiley是正确的,带索引的外键或虚拟列是更好的解决方案。

CREATE OR REPLACE TRIGGER VERIFYTYPE 
BEFORE INSERT OR UPDATE ON A 
FOR EACH ROW
v_type CHAR(3);
BEGIN
SELECT tp.Type
INTO v_type
FROM P tp
WHERE tp.idP=:new.idP;

    IF v_type != 'W'
      THEN 
      RAISE_APPLICATION_ERROR(-20001, 'That is not a worker');
    END IF;
END;

答案 1 :(得分:0)

你必须:

  1. 重命名列'type',因为这是一个关键字,使用它时会遇到很多麻烦

  2. 将变量x添加到声明部分

  3. 使用SELECT col INTO x construct

  4. 在IF构造中使用x