Ok, opublikuję to jako odpowiedź, ponieważ komentarze nie pozwolą na tak dużo tekstu.
Widząc twoje stoły, niektóre rzeczy wciąż nie są jasne. twoja funkcja ADD_PACIENTE_QUARTO
implementuje SELECT
instrukcja, która określa predykat Where PAC = CONT
ale PAC
nie znajduje się w PACIENTE
, ale raczej jest to zmienna lokalna, w której przechowujesz wynik i CONT
jest twoim parametrem, nie jest jasne, czego tam próbowałeś.
Teraz Twój wyzwalacz ma pewne wady w logice i implementacji.
Po pierwsze, nazwa Twojego wyzwalacza to PACIENTE_TRIGGER
ale wiersz INSERT OR UPDATE ON TIPO_QUARTO
mówi mi, że jest na TIPO_QUARTO
tabeli, nie jest to problem składniowy, ale logicznie może być uciążliwy dla kogoś, kto próbuje dowiedzieć się, do której tabeli należy wyzwalacz.
Następnie użyj INSERT OR UPDATE OF TIPO ON TIPO_QUARTO
do monitorowania wstawek lub aktualizowania zmian tylko w kolumnie TIPO
z TIPO_QUARTO
tabeli.
Teraz ta linia If :new.TIPO_QUARTO = 'UTI' then
, zakładając, że ten wyzwalacz jest dołączony do TIPO_QUARTO
tabela, ta tabela nie ma kolumny o nazwie TIPO_QUARTO
zmień to na :new.TIPO
.
Następnie PAC
jest typu VARCHAR
więc nie jest dla mnie jasne, co próbujesz zrobić w PAC := PAC - :new.TIPO;
oraz w PAC := PAC + :new.TIPO;
obie linie zwrócą invalid number
wyjątek, ponieważ nie możesz dodawać ani odejmować ciągów, być może Twoim zamiarem było połączenie lub uzyskanie podciągu.
I na koniec wywołanie UPDATE TIPO_QUARTO SET TIPO = PAC
wewnątrz wyzwalacza dla TIPO_QUARTO
spowoduje mutating table
wyjątek, nie możesz zapytać/zaktualizować tabeli, która jest w środku instrukcji DML (w tym przypadku INSERT lub UPDATE), aby to naprawić, możesz po prostu przypisać :new.TIPO := PAC
.
Zadbaj o te szczegóły, a może wtedy Twój problem przestanie istnieć.