簡體   English   中英

Oracle 觸發器錯誤“ORA-00942:表或視圖不存在”

[英]Oracle Trigger error "ORA-00942: table or view does not exist"

這是我的觸發器:

    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”中的新手機號碼,並檢查該號碼是否存在於“Users”中,如果不存在,則必須將其添加到單獨的表“spaiati”中,其中有一列。 . 它完美地連接到我的個人數據庫(我在上面運行我的 JAVAfx 應用程序,它工作正常,我只需要創建一些觸發器)。

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

如果我使用“on 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.

如果我使用“on tamponi”,現在的錯誤是:

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

由於此代碼將在觸發器中,您會希望它盡可能高效,因為它可能會經常運行。 下面的代碼應該以最少的上下文切換來完成您希望實現的目標。

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;
/

我目前沒有可用的數據庫客戶端,但這應該接近你想要的:

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;

你可以試試這個 -

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM