我有一张桌子" paciente"用" tipo_quarto"每当我在" tipo_quarto"中插入一些东西时,我需要一个触发器表"四分之一"更新" tipo"。
这是函数/触发器
CREATE OR REPLACE FUNCTION ADD_PACIENTE_QUARTO
(CONT IN VARCHAR Default Null)
RETURN VARCHAR
IS
PAC VARCHAR;
BEGIN
Select TIPO_QUARTO into PAC from PACIENTE
Where PAC = CONT;
return PAC;
END ADD_PACIENTE_QUARTO;
create or replace TRIGGER PACIENTE_TRIGGER
AFTER
INSERT OR UPDATE
ON TIPO_QUARTO
FOR EACH ROW
Declare
PAC VARCHAR;
BEGIN
PAC:=ADD_PACIENTE_QUARTO(:new.TIPO_QUARTO);
If :new.TIPO_QUARTO = 'UTI' then
PAC := PAC - :new.TIPO;
else
PAC := PAC + :new.TIPO;
End If;
UPDATE TIPO_QUARTO SET TIPO = PAC
WHERE TIPO = :new.TIPO;
END;
这是表格;
PACIENTE
CREATE TABLE PACIENTE
(
PRIMEIRO_NOME VARCHAR(100) NOT NULL,
SEGUNDO_NOME VARCHAR(100) NOT NULL,
CPF NUMBER(11) NOT NULL,
IDADE NUMBER(3)NOT NULL,
SEXO VARCHAR(1)NOT NULL,
TIPO_QUARTO VARCHAR(3) NOT NULL,
CONSTRAINT PACIENTE_PK PRIMARY KEY(CPF)
);
TIPO_QUARTO
CREATE TABLE TIPO_QUARTO
(TIPO VARCHAR(3)NOT NULL,
PACIENTE_CPF NUMBER(11)NOT NULL,
CONSTRAINT TIPO_QUARTO PRIMARY KEY (TIPO),
CONSTRAINT TIPO_QUARTO_FK FOREIGN KEY(PACIENTE_CPF) REFERENCES PACIENTE(CPF)
);
答案 0 :(得分:0)
好的我会发布这个作为答案,因为评论不会允许这么多文字。
看到你的表有些事情仍然不清楚。您的函数ADD_PACIENTE_QUARTO
实现了SELECT
语句,该语句指出谓词Where PAC = CONT
,但PAC
不在PACIENTE
的规范中,而是您所在的局部变量存储您的结果,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语句中间的表(在这种情况下插入或更新)为了解决此问题,您只需指定:new.TIPO := PAC
。
请注意这些细节,然后你的问题就不会再存在了。