
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.
To: los
Je pravda že tam asi nic v tu dobu nebude takže nemám s čim porovnávat novej záznam, a promiň ale tvojí odpověď jsem nepochopil, můžeš prosím opravdu pro lajka? nějak polopatě? děkuju
Moja odpoveď ti pomôže, iba ak sú tie časy hospitalizácie v rámci jedného dňa, čo asi nie je tvoj prípad.
Môžeš sa inšpirovať u Toma, je to presne to, čo chceš.
jsem asi vážně lama ale vůbec to nechápu potřeboval bych to opravdu nějak hodně jednoduše jestli by to prosím šlo
ale on to nakonec ani trigger být nemusí jen nevím jak jinak to udělat
Keď to chceš opravdu jednoduše, tak si to ošetri na aplikačnej úrovni.