2016-12-07 3 views
0

Я пытаюсь создать триггер, который будет принимать количество крови, переданное для банка крови, и добавить это к текущему количеству для этого конкретного типа крови. Я могу скомпилировать триггер без каких-либо проблем. Однако, когда я запускаю некоторые записи, я получаю три ошибки: ORA-04091, ORA-06512 и ORA-04088. Он говорит, что таблица мутируется, поэтому триггер не может получить доступ к ней, но я использую ее после вставки в триггер, чтобы таблица не была вставлена? Любые предложения были бы замечательными, профессор действительно не очень трогал триггеры.ORA-04091 Ошибка при создании триггера

Trigger:

create or replace trigger addBloodCount 
after insert on Donations 
for each row 
when(new.donationID is not null AND new.donorID is not null AND new.bloodCode is not null AND new.donationDate is not null AND new.amountDonated   is not null) 
declare 
add_amount INTEGER; 
begin 
select amountDonated into add_amount from Donations; 
update Blood 
set quantity = Blood.quantity + add_amount 
where bloodCode =:new.bloodCode; 
end; 
/

Таблицы:

CREATE TABLE Address (
addressID INTEGER NOT NULL, 
street VARCHAR(50) NOT NULL, 
city VARCHAR(40) NOT NULL, 
state VARCHAR(30) NOT NULL, 
zip INTEGER NOT NULL, 
PRIMARY KEY (addressID)); 


CREATE TABLE Donor (
donorID INTEGER NOT NULL, 
fname VARCHAR(50) NOT NULL, 
lname VARCHAR(50) NOT NULL, 
sex VARCHAR(10) NOT NULL, 
addressID INTEGER NOT NULL, 
DOB DATE NOT NULL, 
phoneNo INTEGER NOT NULL, 
PRIMARY KEY (donorID)); 


CREATE TABLE Donations (
donationID INTEGER NOT NULL, 
donorID INTEGER NOT NULL, 
bloodCode INTEGER NOT NULL, 
donationDate DATE NOT NULL, 
amountDonated INTEGER NOT NULL, 
PRIMARY KEY (donationID)); 


CREATE TABLE Blood (
bloodCode INTEGER NOT NULL, 
bloodType VARCHAR(50) NOT NULL, 
bloodPrice DECIMAL NOT NULL, 
quantity INTEGER NOT NULL, 
PRIMARY KEY (bloodCode)); 


CREATE TABLE BloodOrder (
orderID INTEGER NOT NULL, 
bloodCode INTEGER NOT NULL, 
hospitalID INTEGER NOT NULL, 
amountOrdered INTEGER NOT NULL, 
PRIMARY KEY (orderID)); 


CREATE TABLE Hospital (
hospitalID INTEGER NOT NULL, 
hospitalName VARCHAR(50) NOT NULL, 
addressID INTEGER NOT NULL, 
phoneNo INTEGER NOT NULL, 
PRIMARY KEY (hospitalID)); 


alter table Donor 
add (constraint addressID_fk foreign key (addressID) 
references Address(addressID)); 

alter table Donations 
add (constraint donorID_fk foreign key (donorID) 
references Donor(donorID)); 

alter table Donations 
add (constraint bloodCode_fk foreign key (bloodCode) 
references Blood(bloodCode)); 

alter table bloodOrder 
add (constraint bloodCode_fk2 foreign key (bloodCode) 
references Blood(bloodCode)); 

alter table bloodOrder 
add (constraint hospitalID_fk foreign key (hospitalID) 
references Hospital(hospitalID)); 

alter table Hospital 
add (constraint addressID_fk2 foreign key (addressID) 
references Address(addressID)); 

ответ

0

Проблема не вызвана этим утверждением:

select amountDonated into add_amount from Donations; 

Короче говоря, вы не можете ссылаться на значения вставляются непосредственно. Вместо этого вам нужно использовать: NEW. Переписывание триггер следующим образом должен работать:

create or replace trigger addBloodCount 
after insert on Donations 
for each row 
when(new.donationID is not null AND new.donorID is not null AND new.bloodCode is not null AND new.donationDate is not null AND new.amountDonated is not null) 
begin 
update Blood 
set quantity = quantity + :new.amountDonated 
where bloodCode =:new.bloodCode; 
end; 
/

Заявление

when(new.donationID is not null AND new.donorID is not null AND new.bloodCode is not null AND new.donationDate is not null AND new.amountDonated is not null) 

, вероятно, не нужны, так как у вас уже есть NOT NULL ограничения, установленные во всех этих столбцов.

+0

спасибо, что сделал трюк! – Christian

Смежные вопросы