0

ORACLE / PL SQL TRIGGER 我有一个名为unit_tbl 的用于处理住宅属性的表。

主复合键是(unit_num、complex_num 和 owner_num),因此许多所有者可以在同一个复合体中拥有同一个单元。

其他列包括num_of_bedrooms(即4、3、2、1)和property_type(即house、duplex、apartment、condo)。

假设输入了以下语句:

INSERT INTO unit_tbl
  (unit_id, complex_id, owner_id, num_beds, property_type) 
VALUES
  (001, 1000, 010, 3, 'apartment');

我想提出一个错误,以便如果为另一个所有者(相同属性的)输入相同的 unit_id 和 complex_id,如果 num_beds 与前一个条目不匹配或属性类型与前一个条目不匹配。

例如,如果有人要插入或更新以下内容,则会引发错误:

INSERT INTO unit_tbl
   (unit_id, complex_id, owner_id, num_beds, property_type) 
VALUES
  (001, 1000, 011, 2, 'apartment');  -- num_beds here does not match the same property previously entered.

我试过创建一个触发器:

CREATE OR REPLACE TRIGGER unit_consist_check
BEFORE INSERT OR UPDATE ON unit_tbl
FOR EACH ROW
DECLARE
BEGIN
IF :NEW.unit_id = :OLD.unit_id AND :NEW.complex_id=:OLD.complex_id AND ( :NEW.num_beds <> :OLD.num_beds OR :NEW.property_type <> :OLD.property_type) THEN
raise_application_error (-20002, 'nconsistent data on bedroom size or property type.  Please make sure this data is identical to previously entered data for this specific unit_id and complex_id');
END IF;
END;
/

我也尝试过 DECLARING 变量并执行 SELECT INTO 变量,但这似乎会导致获取太多行的错误。

我是 PL/SQL 的新手,非常感谢您的帮助和耐心。

4

1 回答 1

3

您正在使用一种不好的做法——触发器——来弥补另一种不好的做法——非规范化。

添加一个新表以单独存储单元并使用 unit_owner 表将其连接到所有者表,您将不再需要触发器。

于 2013-05-04T09:31:11.160 回答