Добре, ще публикувам това като отговор, защото коментарите няма да позволят толкова много текст.
Виждайки вашите маси, някои неща все още не са ясни. вашата функция 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 .
Погрижете се за тези подробности и може би тогава вашият проблем вече няма да го има.