2016-05-04 20 views
0

私がトリガーについて読んだことと、それがどのように働いているのかから、このトリガーは値を挿入した後に私のテーブルphonenumberに関連する関係にデータを挿入すると考えました。私はランダムに5桁のusageIDを作成するためにdbms_randomを使用しています。使用法のテーブルにはまだありません(またはatleastは私が思う通りです)。なぜこのトリガーは正常に動作しませんか?

create or replace TRIGGER addPhoneLine 
AFTER INSERT ON phoneNumber 
REFERENCING NEW AS NEW 
    FOR EACH ROW 

DECLARE 
    primNum varchar(12); 
    acctNum numeric(5); 
    NEWusageID_new varchar(5); 

BEGIN 

    if :new.primaryNumber is not NULL then 
     select acctID, primaryNumber into acctNum, primNum 
     from account A 
     where A.primaryNumber = :new.primaryNumber; 

     select to_char(round(dbms_random.value(10000, 99999),0)) into 
NEWusageID_new from dual 
     minus 
     select usageID from usage; 

     INSERT INTO acct_num VALUES 
     (acctNum, primNum, :new.phonenumber); 

     INSERT INTO phone_usage VALUES 
     (NEWusageID_new, :new.phonenumber); 
    end if; 

END; 

しかし、私はのPhoneNumberテーブルに挿入しようとしたとき、それは次のエラーがスローされます。

ORA-01403:データが

ORA-06512見つかりませんでした。 "ADDPHONELINE" で、ライン9

ORA-04088:トリガーの実行中にエラー 'ADDPHONELINE'

関連するテーブルは、次のように作成されました:あなたが投稿エラーの説明に従って

create table phoneNumber(phoneNumber varchar(12) PRIMARY KEY, primaryNumber varchar(12)); 

create table acct_num(acctID numeric(5) references ACCOUNT, primaryNumber varchar(12) references ACCOUNT, phoneNumber varchar(12) references phoneNumber); 

create table phone_usage(usageID varchar(5) references USAGE, phoneNumber varchar(12) references PHONENUMBER) 

答えて

1

トリガーはテーブルphoneNumberの挿入に基づいており、SELECT INTOが使用されていて挿入する情報が見つからない場合は "No Data Found"というエラーがスローされます。

したがって、問題はこのステートメントでなければなりません。

select acctID, primaryNumber into acctNum, primNum 
from account A 
where A.primaryNumber = :new.primaryNumber; 

あなたは、このトリガーがアクティブなとき:new.primaryNumberaccountテーブルに存在することは確かか?

この挿入が完了した後でaccountテーブルにデータを入力しているだけでしょうか?

0

以下のクエリは、何の行を返すされません。あなたの:new.primaryNumberが間違っているか、アカウントテーブルに一致するレコードがありません。

Begin 
    select acctID, primaryNumber into acctNum, primNum 
    from account A 
    where A.primaryNumber = :new.primaryNumber; 
exception when others then 
    insert your favorite logging method here logging out your :new.primaryNumber 
end; 
+0

new.primaryNumberの値を確認するにはどうすればよいですか?私はそのクエリを:new.primaryNumberを私のプライマリナンバーとして挿入したものに置き換え、クエリがacctIDとprimaryNumberを返すようにしました。 – JR3652

+0

@ JR3652例外処理で私の答えを更新しました。ログを記録する方法は、これを実行するためにどのツールを使用しているかによって異なります。最悪の場合、ログテーブルを作成し、new.primaryNumberというメッセージを挿入します。 –

0

私は、使用中に存在する、DBMS_RANDOMは値(NEWusageID_new)を与えるときに何が起こるかここであなたを示しています。

DECLARE 
    i NUMBER; 
BEGIN 
    SELECT 15 INTO i FROM DUAL 
    MINUS 
    SELECT 15 FROM DUAL; 
END; 

ORA-01403: no data found 
ORA-06512: in line 4 

は代わりにシーケンスを使用してください。

関連する問題