Ok, posterò questo come risposta perché i commenti non consentiranno così tanto testo.
Vedendo le tue tabelle alcune cose non sono ancora chiare. la tua funzione ADD_PACIENTE_QUARTO
implementa un SELECT
istruzione che afferma il predicato Where PAC = CONT
ma PAC
non è in PACIENTE
ma piuttosto è la variabile locale in cui memorizzi il tuo risultato e CONT
è il tuo parametro, non è chiaro cosa hai provato lì.
Ora il tuo trigger ha alcuni difetti nella logica e nell'implementazione.
Prima di tutto, il nome del tuo attivatore è PACIENTE_TRIGGER
ma la riga INSERT OR UPDATE ON TIPO_QUARTO
mi dice che è sul TIPO_QUARTO
tabella, questo non è un problema sintatticamente ma logicamente può essere una seccatura per qualcuno che sta cercando di capire a quale tabella appartiene il trigger.
Quindi, usa INSERT OR UPDATE OF TIPO ON TIPO_QUARTO
per monitorare gli inserimenti o aggiornare le modifiche solo nella colonna TIPO
di TIPO_QUARTO
tabella.
Ora questa riga If :new.TIPO_QUARTO = 'UTI' then
, supponendo che questo trigger sia allegato a TIPO_QUARTO
tabella, quella tabella non ha una colonna denominata TIPO_QUARTO
cambialo in :new.TIPO
.
Successivamente, PAC
è di tipo VARCHAR
quindi non mi è chiaro cosa stai cercando di fare in PAC := PAC - :new.TIPO;
e in PAC := PAC + :new.TIPO;
entrambe le righe genereranno invalid number
eccezione in quanto non puoi aggiungere o sottrarre stringhe, forse la tua intenzione era quella di concatenare o ottenere una sottostringa.
E infine la chiamata a UPDATE TIPO_QUARTO SET TIPO = PAC
all'interno di un trigger per TIPO_QUARTO
risulterà in mutating table
eccezione, non puoi interrogare/aggiornare una tabella che si trova nel mezzo di un'istruzione DML (INSERT o UPDATE in questo caso) per risolvere questo problema puoi semplicemente assegnare :new.TIPO := PAC
.
Prenditi cura di questi dettagli e forse allora il tuo problema non sarà più.