【发布时间】:2014-09-07 04:56:04
【问题描述】:
希望能得到一些帮助;我正在使用 Oracle。
当前代码:
CREATE OR REPLACE TRIGGER TRG_SAMPLETRG
BEFORE INSERT ON CATEGORY_Details
FOR EACH ROW
DECLARE W_YEARSALIVE NUMBER(3);
BEGIN
SELECT ((SYSDATE - animal_origindate)/365) INTO W_YEARSALIVE
FROM animal
WHERE animal_no = :NEW.animal_no;
IF W_YEARSALIVE < 180 THEN
RAISE_APPLICATION_ERROR(-20005, 'The animal has existed for only ' || W_YEARSALIVE || ' years');
ELSIF W_YEARSALIVE IS NULL THEN
RAISE_APPLICATION_ERROR(-20005, 'The animal has to have a origin date entered before evaluation.');
ELSE
DBMS_OUTPUT.PUT_LINE ('The animal is over 180 years and is not yet extinct and has been added');
END IF;
END;
当我将动物添加到 category_details 表中时,如果该动物的起源日期(以年为单位)小于 180,或者如果它没有起源日期,则不会添加它并出现异常错误将被退回。
现在,我不需要对插入到 category_details 表中的每只动物评估触发器,我只想添加/评估仅来自以下 4 个不同类别的动物的触发器:Monera , 原核生物, 植物, 真核生物
即任何其他不同的类别,即动物界、植物界,甚至都不应该被评估,也就是说,对与这些(或“其他”)类别相关的动物的任何插入没有限制。 p>
我尝试添加带有子查询的 WHEN 语句,如下所示: WHEN (:NEW.kingdom_no IN (SELECT Kingdom_no FROM Kingdom WHERE Kingdom_name IN ('Monera', 'Prokaryota', 'Plantae', 'Eukaryota'))
但您似乎无法将子查询添加到 TRIGGERS...
我找到了这个帖子:Oracle: Using subquery in a trigger
但是,看起来只有 1 个值/类别看起来很整洁,而我有 4 个,并且必须声明 4 个变量?
我还尝试在 IF 语句中放置子查询,但我认为这在 SQL/Oracle 中的语法无效。
感谢您的帮助。
编辑:表结构很简单: 3 个表:动物、category_details 和王国 category_details 的表有以下属性:animal_no, Kingdom_no 动物表具有以下属性:animal_no、animal_origindate Kingdoms 的表有以下属性: Kingdom_no, Kingdom_name
【问题讨论】:
标签: sql oracle triggers subquery