2017-12-06 22 views
0

フィールドInvitationを持つ表PETのトリガーを作成しようとしていて、テーブルPEOPLEのPhoneというフィールドの値に基づいてYesまたはNoになります。電話番号がヌルでない場合、のPETテーブルの他のフィールドのいくつかが有効な値を持ち、ヌルでない場合、Invitationフィールドの値はYesになります。PLSQL ORACLE:トリガーによるエラー

私はそれを行うことができますが、テーブルを更新してフィールドの1つをnullに設定しようとすると、後で問題が発生し、招待フィールドの値をNoに更新しません。だから私は、PETテーブルそのもののトリガを作ることに取り組んでいます。それは、必須フィールドがヌルでないかどうかをチェックして、招待の値を変更できるようにすることです。

しかし、PEOPLEテーブルに向かう前に、ユーザがPETテーブルにデータを入力する必要があるという問題があります。だから私のトリガーは私のテーブルの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テーブルは最初のテーブルとされています。私はこれをどのように修正すべきですか?必要な値がすでに他のテーブル内に存在する場合にのみ、このトリガーをアクティブにする方法はありますか?私は本当に混乱しています。

+0

*「の問題は、ユーザーが人々のテーブルに向かう前にPETテーブルにデータを入力しなければならないことである。」*それはすぐそこにあなたの問題です。あなたが[101 Dalmatians](https://en.wikipedia.org/wiki/One_Hundred_and_One_Dalmatians)をモデリングしていない限り、ペットは人に属します。 – APC

+0

@ APCはい、私がやるべき任務は、地獄のように変です。彼らはあなたが他の何もかもの前にPETにデータを入力することを望んでいます。そして、私は実際にすべてが提供されたときに招待ステータスをyesに変更することができますが、最後にPETテーブルの必須フィールドの値を変更して設定しますそれはnullになります。招待状はまだYESのままです。条件に基づいてトリガーをアクティブにする方法はありますか? – Kim

答えて

0

"最後に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に設定すると動作します。


ここのビジネスロジックは本当に混乱しています。この条件は、3つのテーブルのレコードの存在に基づいています。これは、トリガーの使用が不適切なケースです。より良い実装では、3つのテーブルすべてにレコードを挿入するためのストアドプロシージャを用意し、招待フラグの設定などのビジネスルールを管理します。

明らかにこれは少し曖昧ですが、適切な解決策にはシナリオについての詳細が必要です。あなたは何ですか?レコードはどのように挿入されますか?作業単位(トランザクション)とは何ですか?

0

あなたはエラーが発生していると思います。次に例を示します。

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. 

存在するテーブルの選択カウントは値を返します。

ボビー

+0

さて、PETSテーブルでフィールド値をヌルに更新しようとしましたが、NOに変更されましたが、値を更新しても招待パーツがまだ動作しませんでした:/ – Kim

+0

Ok。よく分かりません。コードを調べるだけで、 "ORA-01403:データが見つかりません"というエラーが発生する可能性があります。私は通常、選択を行う前に同じ基準で数えます。しかし、関係のない問題があるかもしれません。 –

+1

いいえ「データが見つかりません」というエラーが表示されていましたが、ur手順に従っていましたが、修正されてしまいました。 – Kim

関連する問題