sql >> Databáze >  >> RDS >> Oracle

neplatná chyba spouštěče

Ok, pošlu to jako odpověď, protože komentáře nedovolí tolik textu.

Když vidíte své tabulky, některé věci stále nejsou jasné. vaše funkce ADD_PACIENTE_QUARTO implementuje SELECT příkaz, který uvádí predikát Where PAC = CONT ale PAC není v PACIENTE 's specifikace, ale je to spíše lokální proměnná, kam ukládáte výsledek a CONT je váš parametr, není jasné, co jste tam zkoušel.

Nyní má váš spouštěč určité chyby v logice a implementaci.

Za prvé, název vašeho spouštěče je PACIENTE_TRIGGER ale řádek INSERT OR UPDATE ON TIPO_QUARTO říká mi, že je na TIPO_QUARTO tabulka, to není syntaktický problém, ale logicky to může být nepříjemné pro někoho, kdo se snaží zjistit, ke které tabulce spouštěč patří.

Dále použijte INSERT OR UPDATE OF TIPO ON TIPO_QUARTO pouze sledovat přílohy nebo aktualizovat změny ve sloupci TIPO z TIPO_QUARTO tabulka.

Nyní tento řádek If :new.TIPO_QUARTO = 'UTI' then , za předpokladu, že je tento spouštěč připojen k TIPO_QUARTO tabulka, tato tabulka nemá sloupec s názvem TIPO_QUARTO změňte toto na :new.TIPO .

Dále PAC je typu VARCHAR takže mi není jasné, co se snažíš dělat v PAC := PAC - :new.TIPO; a v PAC := PAC + :new.TIPO; oba řádky vyhodí invalid number výjimkou, protože nemůžete přidávat ani odečítat řetězce, možná bylo vaším záměrem zřetězit nebo získat podřetězec.

A nakonec volání na UPDATE TIPO_QUARTO SET TIPO = PAC uvnitř spouštěče pro TIPO_QUARTO výsledkem bude mutating table výjimku, nemůžete dotazovat/aktualizovat tabulku, která je uprostřed příkazu DML (v tomto případě INSERT nebo UPDATE), abyste to napravili, stačí přiřadit :new.TIPO := PAC .

Postarejte se o tyto detaily a možná pak váš problém již nebude.




  1. Vyhledejte a nahraďte část řetězce v databázi

  2. vyhodnotit výraz v MySQL

  3. Filtrování sady výsledků dotazu MySQL pro získání více výskytů v určitém časovém období

  4. Je špatný postup používat instrukce EXIT WHEN při procházení CURSORů v Oracle?