Добре, ще публикувам това като отговор, защото коментарите няма да позволят толкова много текст.
Виждайки вашите маси, някои неща все още не са ясни. вашата функция ADD_PACIENTE_QUARTO
прилага SELECT
израз, който посочва предиката Where PAC = CONT
но PAC
не е в PACIENTE
е спецификацията на 's, а по-скоро е локалната променлива, където съхранявате вашия резултат и CONT
е вашият параметър, не е ясно какво сте опитали там.
Сега вашият тригер има някои недостатъци в логиката и изпълнението.
Първо, името на вашия тригер е PACIENTE_TRIGGER
но редът INSERT OR UPDATE ON TIPO_QUARTO
казва ми, че е на TIPO_QUARTO
таблица, това не е синтактичен проблем, но логически може да бъде болка в задника за някой, който се опитва да разбере към коя таблица принадлежи тригерът.
След това използвайте INSERT OR UPDATE OF TIPO ON TIPO_QUARTO
за наблюдение на вмъквания или актуализиране на промени само в колона TIPO
от TIPO_QUARTO
таблица.
Сега този ред If :new.TIPO_QUARTO = 'UTI' then
, ако приемем, че този тригер е прикачен към TIPO_QUARTO
тази таблица няма колона с име TIPO_QUARTO
променете това на :new.TIPO
.
След това PAC
е от тип VARCHAR
така че не ми е ясно какво се опитвате да направите в PAC := PAC - :new.TIPO;
и в PAC := PAC + :new.TIPO;
и двата реда ще изхвърлят invalid number
изключение, тъй като не можете да добавяте или изваждате низове, може би вашето намерение е било да свържете или да получите подниз.
И накрая извикването на UPDATE TIPO_QUARTO SET TIPO = PAC
вътре в тригер за TIPO_QUARTO
ще доведе до mutating table
изключение, не можете да заявите/актуализирате таблица, която е в средата на DML оператор (INSERT или UPDATE в този случай), за да коригирате това, можете просто да присвоите :new.TIPO := PAC
.
Погрижете се за тези подробности и може би тогава вашият проблем вече няма да го има.