Oracle
 sql >> база данни >  >> RDS >> Oracle

невалидна грешка при задействане

Добре, ще публикувам това като отговор, защото коментарите няма да позволят толкова много текст.

Виждайки вашите маси, някои неща все още не са ясни. вашата функция ADD_PACIENTE_QUARTO прилага SELECT израз, който посочва предиката Where PAC = CONT но PAC не е в PACIENTE е спецификацията на 's, а по-скоро е локалната променлива, където съхранявате вашия резултат и CONT е вашият параметър, не е ясно какво сте опитали там.

Сега вашият тригер има някои недостатъци в логиката и изпълнението.

Първо, името на вашия тригер е PACIENTE_TRIGGER но редът INSERT OR UPDATE ON TIPO_QUARTO казва ми, че е на TIPO_QUARTO таблица, това не е синтактичен проблем, но логически може да бъде болка в задника за някой, който се опитва да разбере към коя таблица принадлежи тригерът.

След това използвайте INSERT OR UPDATE OF TIPO ON TIPO_QUARTO за наблюдение на вмъквания или актуализиране на промени само в колона TIPO от TIPO_QUARTO таблица.

Сега този ред If :new.TIPO_QUARTO = 'UTI' then , ако приемем, че този тригер е прикачен към TIPO_QUARTO тази таблица няма колона с име TIPO_QUARTO променете това на :new.TIPO .

След това PAC е от тип VARCHAR така че не ми е ясно какво се опитвате да направите в PAC := PAC - :new.TIPO; и в PAC := PAC + :new.TIPO; и двата реда ще изхвърлят invalid number изключение, тъй като не можете да добавяте или изваждате низове, може би вашето намерение е било да свържете или да получите подниз.

И накрая извикването на UPDATE TIPO_QUARTO SET TIPO = PAC вътре в тригер за TIPO_QUARTO ще доведе до mutating table изключение, не можете да заявите/актуализирате таблица, която е в средата на DML оператор (INSERT или UPDATE в този случай), за да коригирате това, можете просто да присвоите :new.TIPO := PAC .

Погрижете се за тези подробности и може би тогава вашият проблем вече няма да го има.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. изтекъл период на изчакване. всички обединени връзки бяха използвани и максималния размер на пула беше достигнат

  2. Как да използвате екраниране на фигурни скоби за Oracle

  3. sql selectL редове към колони без подзаявка

  4. SQL trunc/group/order by dates (ден/месец/тримесечие/година) със сума, пропускане на дати без данни

  5. Върнете името на краткия месец от дата в Oracle