2016-12-11 50 views
-1

我很难理解触发器的概念,或者很清楚,在我的情况下使用它的方式。在CHECK中选择?用触发器?

这里是我创建至今:

CREATE TABLE Station 
( 
nomStation VARCHAR2(100), 
capacite NUMBER(5) NOT NULL, 
lieu VARCHAR2(100) NOT NULL, 
region VARCHAR2(100), 
tarif NUMBER(6,2) DEFAULT 0, 
PRIMARY KEY (nomStation), 
CONSTRAINT UC_lieu_region UNIQUE (lieu, region), 
CONSTRAINT regionUnique CHECK (region='Ocean Indien' OR 
           region='Antilles' OR 
           region='Europe' OR 
           region='Ameriques' OR 
           region='Extreme Orient') 
); 

CREATE TABLE Activite 
( 
nomStation VARCHAR2(100), 
libelle VARCHAR2(100), 
prix NUMBER(6,2) DEFAULT 0, 
CONSTRAINT PK_nomStation_libelle PRIMARY KEY (nomStation, libelle), 
CONSTRAINT FK_nomStation FOREIGN KEY (nomStation) REFERENCES Station(nomStation) ON DELETE CASCADE 
); 

我想实现的是对Station.tarif和Activite.prix约束。

Activite.prix < Station.tarif && Activite.prix > 0 

所以很自然我尝试这样做:

CONSTRAINT CH_prix CHECK (prix<(SELECT tarif FROM Station)), 

但我得到的子查询的错误。现在我明白了,我有同样的问题,因为这个话题:Using subquery in a Check statement in Oracle

这是很酷,但不幸的是,我是一个新人,我没有看到一个触发器可以怎样帮助我......

有人吗?

+0

那么,这是一个学校作业还是生产问题?如果是学校,你先问老师/老师吗?如果是生产,那么不应该有人更有经验吗? – mathguy

+0

这是一个学校作业。这不会是,嗯,我不知道该如何说英文,如果这是你的问题,那不算作弊。这不会是我的最终成绩或笔记或其他内容的一部分。我们必须自己找到解决方案,包括在stackoverflow的帮助下。我知道解决方案是基于触发器,我只是不明白如何... – petaire

+0

嗨 - 不,我不是说这是作弊。我的意思是,每当学生有问题时,他们都可以问老师。 (我是一名老师,我从来不知道为什么学生除了问老师之外还会采用其他任何可能的方式)。你有没有在课堂上学习触发器? – mathguy

回答

1

您可以像这样创建trigger

Create or replace trigger tr_activite_prix 
Before insert or update of prix on activite for each row 
is 
v_tarrif station.tarrif%type; 
Begin 
    Select tarrif into v_tarrif 
    From station 
    Where nomstation = :new.nomstation; 
    If :new.prix >= v_tarrif then 
     raise_application_error(-20001,'Invalid prix'); 
    End if; 
End; 
+0

在触发器名称中使用下划线而不是' - ',并使用'for each row'部分。其他明智的你不能使用:新的和:旧的 – GurV

+0

(我在代码可读性的新答案中回答) – petaire

+0

噢好吧,谢谢,我在编辑答案! – petaire