【问题标题】:Oracle Trigger error "ORA-00942: table or view does not exist"Oracle 触发错误“ORA-00942:表或视图不存在”
【发布时间】:2020-09-21 17:13:38
【问题描述】:

这是我的触发器:

    create trigger tampone_trigger
after insert on tamponi.numerotelpaziente
for each row
begin
    IF ( :new.numerotelpaziente not in ( 
    select numtel 
    from users))
    then 
    insert into spaiati values (new.numtel);
    end if;
end;

“Tamponi”表确实存在,“numerotelpaziente”是其中一列... 表“USERS”也存在,“numtel”是它的列之一...... 为什么到底给我一个错误? 触发器应该查找插入“Tamponi”的新手机号码,并检查该号码是否存在于“用户”中,如果不存在,则必须将其添加到分隔表“spaiati”中,其中有一列。 . 它完美连接到我的个人数据库(我在上面运行我的 JAVAfx 应用程序,它工作正常,我只需要创建一些触发器)。

    Report error -
ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:

如果我使用“在 Tamponi 上”而不是同时给出该列,则错误会变成这个:

Report error -
ORA-04082: NEW or OLD references not allowed in table level triggers
04082. 00000 -  "NEW or OLD references not allowed in table level triggers"
*Cause:    The trigger is accessing "new" or "old" values in a table trigger.
*Action:   Remove any new or old references.

如果我使用“在卫生棉条上”,现在的错误是这样的:

2/5       PL/SQL: Statement ignored
2/40      PLS-00405: subquery not allowed in this context
Errori: controllare il log del compilatore

【问题讨论】:

    标签: sql oracle triggers


    【解决方案1】:

    由于此代码将在触发器中,因此您会希望它尽可能高效,因为它可能会经常运行。下面的代码应该可以实现您希望通过最少的上下文切换实现的目标。

    CREATE TRIGGER tampone_trigger
        AFTER INSERT
        ON tamponi
        FOR EACH ROW
    BEGIN
        INSERT INTO spaiati
            SELECT :new.numerotelpaziente
              FROM DUAL
             WHERE NOT EXISTS
                       (SELECT 1
                          FROM users u
                         WHERE u.numtel = :new.numerotelpaziente);
    END;
    /
    

    【讨论】:

    • 是的!这可行,但我确实有一个问题,当您执行“From DUAL”然后选择 1 时,到底发生了什么?
    • DUAL 是一个虚拟表,始终返回一行,通过选择特定值,将始终返回该值。 EXISTS 函数检查是否为 () 中的查询返回任何行,无论值如何。选择 1 将产生与选择 NUMTEL 或任何其他值相同的结果。使用不需要数据库查找的值是最有效的。
    【解决方案2】:

    你可以试试这个-

    create trigger tampone_trigger
    after insert on tamponi
    for each row
    declare
      v_flag  boolean := false;  
    begin
    
    for c in (select numtel from users)
    loop
    if :new.numerotelpaziente = c.numtel 
        then 
        v_flag := true;
        exit;
         end if;
      exit when no_data_found;
     end loop;
        insert into spaiati values (new.numtel);
    end;
    

    【讨论】:

    • 现在出现此错误:2/5 PL/SQL:语句被忽略 2/40 PLS-00405:在此上下文中不允许子查询错误:controllare il log del compilatore
    • 是的,这也有效,让我对触发器有了更多的了解,谢谢
    【解决方案3】:

    我目前没有可用的数据库客户端,但这应该接近您想要的:

    create trigger tampone_trigger
      after insert on tamponi for each row
    declare
        v_exists number;
    begin
        select count(*) into v_exists from users u where u.numtel = :new.numerotelpaziente;
        if (v_exists = 0) then
            insert into spaiati values(:new:numerotelpaziente);
        end if;
    end;
    

    【讨论】:

    • 是的,有人已经回复了,使用标志变量确实有帮助,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2019-01-22
    • 2019-09-29
    • 2015-11-09
    相关资源
    最近更新 更多