Ok, publicaré esto como respuesta porque los comentarios no permitirán tanto texto.
Al ver sus tablas, algunas cosas aún no están claras. tu función ADD_PACIENTE_QUARTO
implementa un SELECT
instrucción que establece el predicado Where PAC = CONT
pero PAC
no está en PACIENTE
es la especificación sino que es la variable local donde almacena su resultado y CONT
es su parámetro, no está claro qué intentó allí.
Ahora su activador tiene algunas fallas en la lógica y la implementación.
En primer lugar, el nombre de su disparador es PACIENTE_TRIGGER
pero la línea INSERT OR UPDATE ON TIPO_QUARTO
me dice que está en el TIPO_QUARTO
table, esto no es un problema sintácticamente, pero lógicamente puede ser un dolor de cabeza para alguien que está tratando de averiguar a qué tabla pertenece el disparador.
A continuación, use INSERT OR UPDATE OF TIPO ON TIPO_QUARTO
para monitorear inserciones o actualizar cambios solo en la columna TIPO
de TIPO_QUARTO
mesa.
Ahora esta línea If :new.TIPO_QUARTO = 'UTI' then
, asumiendo que este disparador está adjunto a TIPO_QUARTO
tabla, esa tabla no tiene una columna llamada TIPO_QUARTO
cambia esto a :new.TIPO
.
A continuación, PAC
es de tipo VARCHAR
así que no me queda claro qué intentas hacer en PAC := PAC - :new.TIPO;
y en PAC := PAC + :new.TIPO;
ambas líneas arrojarán invalid number
excepción ya que no puede sumar o restar cadenas, tal vez su intención era concatenar u obtener una subcadena.
Y por último la llamada a UPDATE TIPO_QUARTO SET TIPO = PAC
dentro de un disparador para TIPO_QUARTO
resultará en mutating table
excepción, no puede consultar/actualizar una tabla que está en medio de una declaración DML (INSERTAR o ACTUALIZAR en este caso) para arreglar esto, simplemente puede asignar :new.TIPO := PAC
.
Ocúpate de estos detalles y tal vez así tu problema no vuelva a existir.