как вызвать функцию внутри триггера

Я пытаюсь создать функцию с помощью 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;

person nahojsan    schedule 24.06.2017    source источник
comment
Пожалуйста, изучите эту ссылку: dba.stackexchange.com/questions/5432/   -  person krokodilko    schedule 24.06.2017


Ответы (1)


Код, вызванный из триггера строки, не может получить доступ к таблице, для которой определен триггер. Здесь триггер определен для таблицы KRS, поэтому ни один код в триггере или во всем, что вызывается триггером, не может получить доступ к таблице KRS. В этом случае ваша функция GET_BIAYA_SEMESTER получает доступ к таблице KRS.

Самое простое, что я могу для вас сделать, это включить вызов GET_BIAYA_SEMESTER в оператор INSERT или UPDATE, что-то вроде

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

Это избавляет от необходимости вызывать функцию из триггера.

Удачи.

person Bob Jarvis - Reinstate Monica    schedule 24.06.2017