簡體   English   中英

PLSQL ORACLE:觸發器錯誤

[英]PLSQL ORACLE: Errors with triggers

我正在嘗試為具有字段邀請的表PET觸發,並根據表PEOPLE中稱為電話的字段的值將其變為YesNo 如果電話值不為null, 並且 PET表中的其他某些字段具有有效值且不為null,則Invitation字段中的值應變為Yes

我能夠做到這一點,但問題出在后來,當我嘗試更新表並將其中一個字段設置為null時,它不會將邀請字段的值更新為No 因此,現在我正在為PET表本身創建觸發器,以檢查所需字段是否不為空,以便可以更改邀請的值。

但是,問題在於,用戶必須先向PET表輸入數據,然后再進入PEOPLE表。 因此,當我在表PET中插入數據時,觸發器無法獲取任何值。

這是我為觸發器所做的:

create or replace trigger Phone_check
    before insert or update on PETS
    for each row
DECLARE
    SELECT phone INTO v_phone 
    FROM PEOPLE 
        INNER JOIN Family ON PEOPLE.ID=FAMILY.ID 
        INNER JOIN PETS ON FAMILY.ID=PETS.ID 
    WHERE PETS.ID=:NEW.ID;
    IF :NEW.NAME IS NOT NULL 
    AND :NEW.AGE IS NOT NULL 
    AND v_phone IS NOT NULL THEN
        :NEW.INVITATION:='Yes';
    ELSIF :NEW.NAME IS NULL 
    OR :NEW.AGE IS NULL 
    AND v_phone IS NULL THEN
       :NEW.INVITATION:='No';
    END IF;
END;

我知道此觸發器的問題是:人員表或家庭表中還沒有任何值。 但是PET表應該是第一個表。 我該如何解決? 只有在其他表中已經存在所需值之后,才可以激活該觸發器嗎? 我真的很困惑

“最后,我在PET表中的必填字段之一中更改了一個值並將其設置為null時,邀請仍然保持設置為YES。”

觸發器中促使將邀請更改為“ No是:

ELSIF :NEW.NAME IS NULL 
OR :NEW.AGE IS NULL 
AND v_phone IS NULL THEN

因此,如果PEOPLE.PHONE不為null,則觸發器將不會進入該分支。 看來您想要的是:

ELSIF :NEW.NAME IS NULL 
OR :NEW.AGE IS NULL 
OR v_phone IS NULL THEN

如果將PET.NAME或PET.AGE設置為null,則觸發器將起作用。


這里的業務邏輯確實很混亂。 條件基於三個表中記錄的存在:這是觸發器的較差用例。 更好的實現是使用存儲過程將記錄插入所有三個表中,並且該存儲過程管理諸如設置邀請標志的業務規則。

顯然,這有點含糊,但是正確的解決方案將需要有關您的方案的更多詳細信息。 您的申請是什么? 如何插入記錄? 什么是工作單元(交易)?

我認為您遇到了錯誤。 這是一個例子:

SQL> declare
  2  test number;
  3  begin
  4  select blocks into test from user_segments where segment_name='asdfasdfasdf';
  5  if test is not null then
  6    test := 1;
  7  end if;
  8  end;
  9  /
declare
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 4

當選擇不返回結果而沒有得到找不到數據的錯誤時,就無法測試選擇中的變量。 我通常只是算一下。

SQL> declare
  2  test number;
  3  begin
  4  select count(blocks) into test from user_segments where segment_name='asdfasdfasdf';
  5  if test > 0 then
  6      select blocks into test from user_segments where segment_name='asdfasdfasdf';
  7      test := 1;
  8  end if;
  9  end;
 10  /

PL/SQL procedure successfully completed.

存在的表上的選擇計數將返回一個值。

鮑比

暫無
暫無

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

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