2016-12-11 5 views
-1

Ich habe Schwierigkeiten, das Trigger-Konzept zu verstehen, oder, um ganz klar zu sein, den Weg, es in meinem Fall zu verwenden.SELECT in einem CHECK? Mit einem Auslöser?

Hier ist meine CREATE bisher:

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 
); 

Was will ich erreichen, um eine Einschränkung für Station.tarif und Activite.prix ist.

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

So natürlich habe ich versucht, dies:

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

Aber ich bekomme die Unterabfrage Fehler. Jetzt verstehe ich, dass ich das gleiche Problem wie dieses Thema habe: Using subquery in a Check statement in Oracle

was cool ist, aber leider, ich bin ein Neuling, und ich sehe nicht, wie ein Auslöser mir helfen ...

jedermann?

+0

Also, ist dies eine Schulaufgabe oder ein Produktionsproblem? Wenn es Schule ist, hast du zuerst den Lehrer/Lehrer gefragt? Wenn es Produktion ist, sollte nicht jemand Erfahrener dies tun? – mathguy

+0

Es ist eine Schulaufgabe. Es wird nicht sein, mmm Ich weiß nicht, wie ich das auf Englisch sagen soll, es ist kein Betrug, wenn das deine Frage ist. Dies ist nicht Teil meiner Abschlussnote oder Anmerkung oder was auch immer. Wir müssen die Lösung selbst finden, auch mit Hilfe von stackoverflow. Ich weiß, dass die Lösung auf Triggern basiert, ich verstehe einfach nicht, wie ... – petaire

+0

Hallo - nein, ich wollte damit nicht sagen, dass es betrügt. Was ich meinte war, wenn Schüler Fragen haben, können sie den Lehrer fragen. (Ich war ein Lehrer und ich habe nie verstanden, warum Schüler andere Möglichkeiten nutzen würden, außer den Lehrer zu fragen.) Hast du Auslöser in der Klasse gelernt? – mathguy

Antwort

1

Sie können ein trigger wie folgt erstellen.

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

Verwenden Sie einen Unterstrich in Ihrem Triggernamen anstelle von '-' und verwenden Sie den 'für jede Zeile'. Andere weise können Sie nicht verwenden: neu und: alt – GurV

+0

(Ich antwortete darauf in einer neuen Antwort für die Codelisibilität) – petaire

+0

Oh ok ja danke, ich bearbeite die Antwort! – petaire

Verwandte Themen