Được rồi, tôi sẽ đăng bài này như một câu trả lời vì nhận xét sẽ không cho phép nhiều văn bản này.
Nhìn thấy bảng của bạn một số điều vẫn chưa rõ ràng. chức năng của bạn ADD_PACIENTE_QUARTO
triển khai SELECT
câu lệnh nêu rõ vị từ Where PAC = CONT
nhưng PAC
không có trong PACIENTE
đặc điểm kỹ thuật của nhưng đúng hơn là biến cục bộ nơi bạn lưu trữ kết quả của mình và CONT
là thông số của bạn, không rõ bạn đã thử gì ở đó.
Bây giờ trình kích hoạt của bạn có một số sai sót trong logic và triển khai.
Trước hết, tên trình kích hoạt của bạn là PACIENTE_TRIGGER
nhưng dòng INSERT OR UPDATE ON TIPO_QUARTO
cho tôi biết nó nằm trên TIPO_QUARTO
bảng, đây không phải là một vấn đề về mặt cú pháp nhưng về mặt logic có thể là một vấn đề nhức nhối đối với những người đang cố gắng tìm ra bảng nào mà trình kích hoạt thuộc về.
Tiếp theo, sử dụng INSERT OR UPDATE OF TIPO ON TIPO_QUARTO
để theo dõi Phụ trang hoặc cập nhật các thay đổi chỉ trong cột TIPO
trong tổng số TIPO_QUARTO
bảng.
Bây giờ dòng này If :new.TIPO_QUARTO = 'UTI' then
, giả sử trình kích hoạt này được đính kèm với TIPO_QUARTO
bảng, bảng đó không có cột có tên TIPO_QUARTO
thay đổi điều này thành :new.TIPO
.
Tiếp theo, PAC
thuộc loại VARCHAR
vì vậy tôi không rõ bạn đang cố gắng làm gì trong PAC := PAC - :new.TIPO;
và trong PAC := PAC + :new.TIPO;
cả hai dòng sẽ ném ra invalid number
ngoại lệ vì bạn không thể thêm hoặc trừ các chuỗi, có thể ý định của bạn là nối hoặc lấy một chuỗi phụ.
Và cuối cùng là cuộc gọi đến UPDATE TIPO_QUARTO SET TIPO = PAC
bên trong trình kích hoạt cho TIPO_QUARTO
sẽ dẫn đến mutating table
ngoại lệ, bạn không thể truy vấn / cập nhật bảng nằm giữa câu lệnh DML (INSERT hoặc UPDATE trong trường hợp này) để khắc phục điều này, bạn chỉ có thể gán :new.TIPO := PAC
.
Hãy quan tâm đến chi tiết này và có thể vấn đề của bạn sẽ không còn nữa.