
Trigger - provádění kódu bylo dokončeno s varováním
Zdravim všechny,
s databázema jsem docela nováček a potřeboval bych pomoci s jedním triggerem. Mám databázi evidenci pacientů. Potřeboval bych aby se v entitě hospitalizace kde se ukládá datum od a datum do a PK je nějaký id hospitalizace, aby nemohl být pacient přiřazen na dvě hospitalizace ve stejné datum. id_pacient je jako FK u hospitalizace. Tohle jsem zkoušel ale hází Warning: provádění kódu bylo dokončeno s varováním.
Myslíte že by mi prosím někdo mohl pomoct.
Předem díky
tady je můj pokus:
CREATE TRIGGER HOSP_pacient
BEFORE
INSERT
ON Hospitalizace
FOR EACH ROW
BEGIN
if new.dat_od_hosp>old.dat_od_hosp and new.dat_do_hosp<old.dat_do_hosp and new.id_pacient = old.id_pacient
THEN raise_application_error('Pacient již je v tento datum hospitalizován'); END IF;
END;
Zmena predmetu, pôvodne: Trigger (los)
Zobraz si to varování:
Nicméně tvoje podmínka bude fungovat. Kontroluješ jestli jedna hospitace není datumově uvnitř jiné, ale už nekontroluješ když se překrývají pouze částečně.
2/8 PLS-00201: identifikátor 'NEW.DAT_OD_HOSP' musí být deklarován
2/1 PL/SQL: Statement ignored
tohle je to varování jenže nevim moc i tak co s nim
Takže Oracle - v tom prípade ti chýba dvojbodka pred new a old.
To je chyba, ale problem je v logice toho triggeru:
v INSERT triggeru tezko muze byt definovana hodnota OLD, zadny takovy radek NENI DEFINOVAN pro tento trigger.
Protoze podle toho co uzivatel chce si musi uzivatel vyselectovat stejneho id_pacienta a na stejnem id_pacientovy i id_hospitace jako jiz existujiciho radku a na zaklade toho rozhodovat.
Zpusobu reseni je nekolik - od aplikacni logiky az po MERGE - kde to bude kontrolovat trigger UPDATE, protoze podle mne jeden ID_PACIENT muze mit pouze jeden hospitacni aktivni zaznam.
Dalsi moznosti je treba kompozitni trigger (oracle 11.2g+), kde se lze ptat updatovane tabulky za jistycb okolnosti.