Ok, vou postar isso como uma resposta porque os comentários não permitirão tanto texto.
Vendo suas mesas algumas coisas ainda não estão claras. sua função
ADD_PACIENTE_QUARTO
implementa um SELECT
declaração que declara o predicado Where PAC = CONT
mas PAC
não está em PACIENTE
's, mas sim a variável local onde você armazena seu resultado e CONT
é o seu parâmetro, não está claro o que você tentou lá. Agora seu gatilho tem algumas falhas na lógica e na implementação.
Em primeiro lugar, o nome do seu gatilho é
PACIENTE_TRIGGER
mas a linha INSERT OR UPDATE ON TIPO_QUARTO
me diz que está no TIPO_QUARTO
tabela, isso não é um problema sintaticamente, mas logicamente pode ser uma dor de cabeça para alguém que está tentando descobrir a qual tabela o gatilho pertence. Em seguida, use
INSERT OR UPDATE OF TIPO ON TIPO_QUARTO
para monitorar inserções ou atualizar alterações somente na coluna TIPO
de TIPO_QUARTO
tabela. Agora esta linha
If :new.TIPO_QUARTO = 'UTI' then
, supondo que este gatilho esteja anexado a TIPO_QUARTO
tabela, essa tabela não tem uma coluna chamada TIPO_QUARTO
mude para :new.TIPO
. Em seguida,
PAC
é do tipo VARCHAR
então não está claro para mim o que você está tentando fazer em PAC := PAC - :new.TIPO;
e em PAC := PAC + :new.TIPO;
ambas as linhas lançarão invalid number
exceção, pois você não pode adicionar ou subtrair strings, talvez sua intenção fosse concatenar ou obter uma substring. E por último a chamada para
UPDATE TIPO_QUARTO SET TIPO = PAC
dentro de um gatilho para TIPO_QUARTO
resultará em mutating table
exceção, você não pode consultar/atualizar uma tabela que está no meio de uma instrução DML (INSERT ou UPDATE neste caso) para corrigir isso, basta atribuir :new.TIPO := PAC
. Cuide desses detalhes e talvez aí seu problema não seja mais.