2017-06-24 18 views
1

Oracle PL/SQLを使用して関数を作成しようとしています。この関数はトリガーの内部で呼び出されます。私はトリガーをコンパイルするときにエラーが見つかりませんでしたが、テーブルに挿入するとkrsが表示されますトリガー内で関数を呼び出す方法

ORA-04091: table TIKET_BUS.KRS is mutating, trigger/function may not see it 
ORA-06512: at "TIKET_BUS.GET_BIAYA_SEMESTER", line 4 
ORA-06512: at "TIKET_BUS.GET_BIAYA_SEMESTER", line 17 
ORA-06512: at "TIKET_BUS.TAGIH", line 4 
ORA-04088: error during execution of trigger 'TIKET_BUS.TAGIH' 

私は何が欠けていますか?

機能:

create or replace FUNCTION GET_BIAYA_SEMESTER 
(NO_INDUK CHAR) RETURN NUMBER IS 
CURSOR C_IPK IS 
SELECT 
k.SKS, n.kd_semester 
FROM 
MATA_KULIAH k, krs n 
WHERE 
k.KD_MK = n.kd_mk and n.nim = NO_INDUK; 
BARIS C_IPK%ROWTYPE; 
S MAHASISWA.NAMA%TYPE; 
TOTAL_BIAYA NUMBER := 0; 
X NUMBER; 
SKS NUMBER; 
BIAYA NUMBER; 
BEGIN 
OPEN C_IPK; 
LOOP 
FETCH C_IPK INTO BARIS; 
EXIT WHEN C_IPK%NOTFOUND; 
X := BIAYA_MAKUL(BARIS.SKS); 
TOTAL_BIAYA := total_BIAYA + X; 
END LOOP; 
BIAYA := TOTAL_BIAYA; 
CLOSE C_IPK; 
RETURN BIAYA; 
END; 

トリガ:

create or replace trigger tagih 
after insert on krs 
for each row 
declare 
x number; 
begin 
x := get_biaya_semester(:new.nim); 
update tagihan set bayar = (x) where nim = :new.nim; 
end; 
+0

このリンクを調べてください:https://dba.stackexchange.com/questions/5432/what-are-the-causes-and-solutions-for-mutating-table-errors – krokodilko

答えて

0

行トリガーから起動コードは、トリガが定義されているテーブルにアクセスすることができません。ここでトリガーはテーブルKRSに定義されているため、トリガー内のコードやトリガーによって呼び出されたものはテーブルKRSにはアクセスできません。この場合、あなたの関数GET_BIAYA_SEMESTERアクセステーブルKRS。私はあなたがすることができますため

最も簡単な方法は、これは、トリガーから関数を呼び出す必要がなくなり、INSERTまたはUPDATE文で

UPDATE KRS 
    SET SOME_FIELD = 123, 
     SOME_OTHER_FIELD = 456, 
     NIM = NIM_VALUE, 
     BAYAR = GET_BIAYA_SEMESTER(NIM_VALUE); 

のようなものをGET_BIAYA_SEMESTERへの呼び出しを含めることです。

幸運のベスト。

関連する問題