Oracle触发器-错误:ORA-00903:表名无效

Oracle触发器-错误:ORA-00903:表名无效,oracle,plsql,Oracle,Plsql,我的sql代码有问题 CREATE OR REPLACE TRIGGER BEFORE UPDATE ON TABAPPOGGIO FOR EACH ROW DECLARE ERRORE EXCEPTION; begin IF :NEW_ConteggioPrenotazioni>150 THEN RAISE ERRORE; END IF; exception when errore then raise_application_error (-20002, 'Sala Piena');

我的sql代码有问题

CREATE OR REPLACE TRIGGER
BEFORE UPDATE ON TABAPPOGGIO
FOR EACH ROW
DECLARE
ERRORE EXCEPTION;
begin
IF :NEW_ConteggioPrenotazioni>150
THEN RAISE ERRORE;
END IF;
exception
when errore then raise_application_error (-20002, 'Sala Piena');
end;
我之前为Tabapoggio创建了一个查询:

CREATE VIEW TABAPPOGGIO
AS
SELECT COUNT(Codice) AS ConteggioPrenotazioni
FROM PRENOTAZIONI
WHERE Sala='101'
GROUP BY Codice
但它一直告诉我ORA-00903:无效的表名。 有什么帮助或建议吗?谢谢

编辑:对不起!!!我不小心删除了某人的评论,他告诉我忘记了触发器的名称。我看到了记号并点击了它,但是。。。我失败了。对不起,我还需要了解按钮是如何工作的,我是新来的。
无论如何,谢谢你!!!我简直是个傻瓜,忘了触发器的名字。我没有意识到,大家都惊慌失措。非常感谢你

您的代码有一些语法问题,但主要问题是,如果我理解您的需要,它将无法实现您的期望

如果我正确地解释了您的需要,那么您需要防止在一个表中插入超过150行的sala值。 如果是这样,您只需在表上构建一个触发器进行检查,在插入一行或多行后执行计数

例如:

create table PRENOTAZIONI( sala varchar2(10), codice number);

create or replace trigger checkPrenotazioni
after insert on prenotazioni
declare
    vNum   number;
    ERRORE EXCEPTION;
begin
    select count(codice)
    into vNum
    from prenotazioni
    where sala = '101';
    --
    IF vNum >150
        THEN RAISE ERRORE;
    END IF;
exception
    when errore
        then raise_application_error (-20002, 'Sala Piena');    
end; 
现在我插入了150行sala='101',一切都很顺利:

SQL> insert into prenotazioni(sala, codice) select '101', 101 from dual connect by level <= 150;

150 rows created.
如果我尝试在一次快照中插入151行,情况也是如此:

SQL> truncate table prenotazioni;

Table truncated.

SQL> select count(1) from prenotazioni;

  COUNT(1)
----------
         0

SQL> insert into prenotazioni(sala, codice) select '101', 101 from dual connect by level <= 151;
insert into prenotazioni(sala, codice) select '101', 101 from dual connect by level <= 151
            *
ERROR at line 1:
ORA-20002: Sala Piena
ORA-06512: at "ALEK.CHECKPRENOTAZIONI", line 15
ORA-04088: error during execution of trigger 'ALEK.CHECKPRENOTAZIONI'
如果要在视图上创建触发器,则需要替代触发器。 INSTEAD OF触发器对视图上的DML事件有效。它们对于DDL或数据库事件无效

演示

在您的情况下,它变成:

CREATE OR REPLACE TRIGGER InsteadTrigger on  TABAPPOGGIO
INSTEAD OF UPDATE OR INSERT
DECLARE
ERRORE EXCEPTION;
begin
IF :NEW.ConteggioPrenotazioni>150
THEN RAISE ERRORE;
END IF;
exception
when errore then raise_application_error (-20002, 'Sala Piena');
end;

注意:您可以同时读取:OLD和:NEW值,但无法写入:OLD或:NEW值。

您的想法似乎太复杂了。要限制表PRENOTAZIONI中的记录,请为该表编写一个插入触发器

CREATE OR REPLACE TRIGGER trg_too_many_prenotazioni
AFTER INSERT ON prenotazioni
DECLARE
  v_count INTEGER;
BEGIN
  select count(*) into v_count from prenotazioni where sala = 101;
  IF v_count > 150 THEN
    RAISE_APPLICATION_ERROR(-20002, 'sala piena');
  END IF;
END trg_too_many_prenotazioni;

也许您想要一个SALA表,其中包含每个SALA的记录和一列允许的prenotazioni的数量,而不是在这里为SALA=101硬编码150。

是否创建了表“TABAPPOGGIO”?您缺少触发器的名称,并且:NEW_ConteggioPrenotazioni应该是:NEW.ConteggioPrenotazioni,但问题是:这应该做什么?我相信,即使您解决了这些语法问题,这也不能满足您的需要。请发布您需要做什么才能获得更好的帮助除了触发器,您希望更新TABAPPOGGIO set ConteggioPrenotazioni=100做什么?在PRENOTAZIONI中突然有100条Sala='101'的记录?基本上我需要检查prenotations!如果预旋转的数量超过实际可能预旋转的数量,例如,有150个座位,因此我可以进行150次预旋转,而当其他人添加预旋转时,它将进行151次预旋转,这将引发错误。事实上,它实际上并没有做它应该做的事情。我真丢脸,呜咽。你能帮帮我吗?你的触发器工作,但我尝试了插入部分,但有一个唯一的错误。可能是因为我是如何创建表的?我试图在不知道表结构的情况下插入一些测试记录,因此我的数据可能与您的结构不匹配。然而,这只是为了测试,你可以构建你的测试用例来测试你的结构,如果你的答案中有一个适合你,请接受它;这既是一种将问题标记为结束的方式,也是对帮助你的人表示感谢的方式。当有人回答你时,你会发现更多关于该怎么做的事情。
CREATE OR REPLACE TRIGGER InsteadTrigger on  TABAPPOGGIO
INSTEAD OF UPDATE OR INSERT
DECLARE
ERRORE EXCEPTION;
begin
IF :NEW.ConteggioPrenotazioni>150
THEN RAISE ERRORE;
END IF;
exception
when errore then raise_application_error (-20002, 'Sala Piena');
end;
CREATE OR REPLACE TRIGGER trg_too_many_prenotazioni
AFTER INSERT ON prenotazioni
DECLARE
  v_count INTEGER;
BEGIN
  select count(*) into v_count from prenotazioni where sala = 101;
  IF v_count > 150 THEN
    RAISE_APPLICATION_ERROR(-20002, 'sala piena');
  END IF;
END trg_too_many_prenotazioni;