Ok, jag lägger upp det här som ett svar eftersom kommentarer inte tillåter så mycket text.
När du ser dina tabeller är vissa saker fortfarande otydliga. din funktion ADD_PACIENTE_QUARTO
implementerar en SELECT
sats som anger predikatet Where PAC = CONT
men PAC
finns inte i PACIENTE
s specifikation utan är snarare den lokala variabeln där du lagrar ditt resultat och CONT
är din parameter, är det inte klart vad du försökte där.
Nu har din trigger några brister i logik och implementering.
Först och främst är utlösarens namn PACIENTE_TRIGGER
men raden INSERT OR UPDATE ON TIPO_QUARTO
säger att det finns på TIPO_QUARTO
tabell, detta är inte ett problem syntaktiskt men logiskt sett kan det vara jobbigt för någon som försöker ta reda på vilket bord utlösaren tillhör.
Använd sedan INSERT OR UPDATE OF TIPO ON TIPO_QUARTO
för att övervaka infogningar eller uppdatera ändringar endast i kolumnen TIPO
av TIPO_QUARTO
bord.
Nu den här raden If :new.TIPO_QUARTO = 'UTI' then
, förutsatt att denna utlösare är kopplad till TIPO_QUARTO
tabell, den tabellen har inte en kolumn med namnet TIPO_QUARTO
ändra detta till :new.TIPO
.
Nästa, PAC
är av typen VARCHAR
så det är oklart för mig vad du försöker göra i PAC := PAC - :new.TIPO;
och i PAC := PAC + :new.TIPO;
båda raderna kommer att visa invalid number
undantag eftersom du inte kan lägga till eller subtrahera strängar, kanske din avsikt var att sammanfoga eller att få en understräng.
Och slutligen uppmaningen till UPDATE TIPO_QUARTO SET TIPO = PAC
inuti en utlösare för TIPO_QUARTO
kommer att resultera i mutating table
undantag, du kan inte fråga/uppdatera en tabell som är mitt i en DML-sats (INSERT eller UPDATE i det här fallet) för att fixa detta, du kan bara tilldela :new.TIPO := PAC
.
Ta hand om dessa detaljer så kanske ditt problem inte finns kvar.