Ok, pošlu to jako odpověď, protože komentáře nedovolí tolik textu.
Když vidíte své tabulky, některé věci stále nejsou jasné. vaše funkce ADD_PACIENTE_QUARTO
implementuje SELECT
příkaz, který uvádí predikát Where PAC = CONT
ale PAC
není v PACIENTE
's specifikace, ale je to spíše lokální proměnná, kam ukládáte výsledek a CONT
je váš parametr, není jasné, co jste tam zkoušel.
Nyní má váš spouštěč určité chyby v logice a implementaci.
Za prvé, název vašeho spouštěče je PACIENTE_TRIGGER
ale řádek INSERT OR UPDATE ON TIPO_QUARTO
říká mi, že je na TIPO_QUARTO
tabulka, to není syntaktický problém, ale logicky to může být nepříjemné pro někoho, kdo se snaží zjistit, ke které tabulce spouštěč patří.
Dále použijte INSERT OR UPDATE OF TIPO ON TIPO_QUARTO
pouze sledovat přílohy nebo aktualizovat změny ve sloupci TIPO
z TIPO_QUARTO
tabulka.
Nyní tento řádek If :new.TIPO_QUARTO = 'UTI' then
, za předpokladu, že je tento spouštěč připojen k TIPO_QUARTO
tabulka, tato tabulka nemá sloupec s názvem TIPO_QUARTO
změňte toto na :new.TIPO
.
Dále PAC
je typu VARCHAR
takže mi není jasné, co se snažíš dělat v PAC := PAC - :new.TIPO;
a v PAC := PAC + :new.TIPO;
oba řádky vyhodí invalid number
výjimkou, protože nemůžete přidávat ani odečítat řetězce, možná bylo vaším záměrem zřetězit nebo získat podřetězec.
A nakonec volání na UPDATE TIPO_QUARTO SET TIPO = PAC
uvnitř spouštěče pro TIPO_QUARTO
výsledkem bude mutating table
výjimku, nemůžete dotazovat/aktualizovat tabulku, která je uprostřed příkazu DML (v tomto případě INSERT nebo UPDATE), abyste to napravili, stačí přiřadit :new.TIPO := PAC
.
Postarejte se o tyto detaily a možná pak váš problém již nebude.