无效的触发错误

时间:2017-06-30 16:12:11

标签: oracle

我有一张桌子" 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)
);

1 个答案:

答案 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

请注意这些细节,然后你的问题就不会再存在了。