2012-04-02 4 views
2

У меня есть триггер таблицы, как показано ниже:Oracle Форма FRM-40735: ON-ERROR триггер поднял необработанное исключение ORA-06502

CREATE OR REPLACE TRIGGER PAT_BUR_DOB_TRG 
BEFORE UPDATE OF DOB 
ON PAT 
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
-- PL/SQL Block 
begin 
    tgln_sys_error_pkg.compare_dates(trunc(add_months(:new.dob, -12)), 
            trunc(tgln_sys_error_pkg.GET_LIST_DATE(:old.pat_id)), 
            tgln_sys_errnums_pkg.en_retr_waitlist_date); 
end; 

-------------------------------------- 

У меня есть пакет, который называется приведенной выше триггером, код для пакет, как показано ниже:

CREATE OR REPLACE PACKAGE TGLN_SYS_ERROR_PKG AS 

/* To compare two dates against each other. */ 
PROCEDURE COMPARE_DATES 
(P_DATE_LOW date 
,P_DATE_HIGH date 
,P_ERROR_CODE number 
); 

FUNCTION GET_LIST_DATE 
(P_PAT_ID number) 
RETURN DATE; 

END TGLN_SYS_ERROR_PKG; 
-------------------------------------- 

тело пакета, как показано ниже:

CREATE OR REPLACE PACKAGE BODY TGLN_SYS_ERROR_PKG AS 

FUNCTION GET_LIST_DATE(P_PAT_ID number) RETURN DATE IS 
    v_ret_date date; 
begin 

    --select to_date('01-JAN-1980') into p_Date from dual; 

    select max(pwl.eff_date) 
    into v_ret_date 
    from pat, pat_register pr, pat_register_org_det prod, pat_wait_list pwl 
    where pat.pat_id = pr.pat_id 
    and pr.patr_id = prod.patr_id 
    and prod.prod_id = pwl.prod_id 
    and pat.pat_id = P_PAT_ID 
    and rownum < 2 
    AND pwl.exp_date is null; 
    return nvl(v_ret_date, to_date(null)); 
exception 
    when no_data_found then 
    return to_date(null); 
end GET_LIST_DATE; 


PROCEDURE COMPARE_DATES 
(P_DATE_LOW date 
,P_DATE_HIGH date 
,P_ERROR_CODE number 
) 
IS 
begin 
if nvl(p_date_low,sysdate-10000)>nvl(p_date_high,sysdate+10000) then 
raise_application_error(p_error_code,null); 
end if; 
end compare_dates; 

end TGLN_SYS_ERROR_PKG; 
--------------------------------------  
CREATE OR REPLACE PACKAGE TGLN_SYS_ERRNUMS_PKG IS 
en_retr_waitlist_date CONSTANT INTEGER := -20088; --Patient waitlist effective dates must not be less than or equal to patient's date of birth minus one year (DOB - 1 year).  
END TGLN_SYS_ERRNUMS_PKG; 
-------------------------------------- 

Каждый раз, когда Oracle Form ы обновление данных DOB, я получаю ошибку, как показано ниже:

Oracle Form FRM-40735: ON-ERROR trigger raised unhandled exception ORA-06502

Но, когда я жесткий код, как показано ниже:

select to_date('01-JAN-1980') into p_Date from dual; 

, чтобы вместо этого пункта кода, как показано ниже, форма работает отлично.

select max(pwl.eff_date) 
    into v_ret_date 
    from pat, pat_register pr, pat_register_org_det prod, pat_wait_list pwl 
    where pat.pat_id = pr.pat_id 
    and pr.patr_id = prod.patr_id 
    and prod.prod_id = pwl.prod_id 
    and pat.pat_id = P_PAT_ID 
    and rownum < 2 
    AND pwl.exp_date is null; 

я заменить p_pat_id к реальной стоимости, он всплывает ошибка запуска

ORA-04091: table TGLN.PAT is mutating, trigger/function may not see it 
ORA-06512: at "TGLN.TGLN_SYS_ERROR_PKG", 
line 130 ORA-06512: at "TGLN.PAT_BUR_DOB_TRG", 
line 26 ORA-04088: error during execution of trigger 'TGLN.PAT_BUR_DOB_TRG' 
View program sources of error stack?" 

Итак, как исправить ошибку? Я не могу жесткий код значения даты

+2

Не вы просто спросите это несколько минут/часов назад? Могли бы вы хотя бы сохранить исправления форматирования? Не удаляйте и не отправляйте вопросы, это раздражает (и в конечном итоге приведет к автоматическому запрету вопроса, если вы это делаете слишком часто.) – Mat

+0

@ user1308891: 'tgln_sys_error_pkg.compare_dates' не находится в спецификации, его частной процедуре. вы вызываете эту процедуру из триггера. Пожалуйста, исправьте свой код –

+0

Извините, я новичок в Stackoverflow, не знаю, как его использовать. Пожалуйста! – user1308891

ответ

1

Ошибка:

ORA-04091: table name is mutating, trigger/function may not see it/

Ваша ошибка

trigger error:"ORA-04091: table TGLN.PAT is mutating

Причина:

Заявление казнены trigge r или пользовательская функция PL/SQL. Этот триггер/функция попытался изменить или запросить таблицу, которая в настоящее время модифицируется оператором, запускающим триггер/функцию.

Ваш Причина

--you're not supposed to query a table that is currently modified 
--In you're case its `PAT` table being updated and querying at same time 
select max(pwl.eff_date) 
into v_ret_date 
from pat, --here you are querying your PAT table,while updating the same table 
     pat_register pr, pat_register_org_det prod, pat_wait_list pwl 
    where pat.pat_id = pr.pat_id 
    and pr.patr_id = prod.patr_id 
    and prod.prod_id = pwl.prod_id 
    and pat.pat_id = P_PAT_ID 
    and rownum < 2 
    AND pwl.exp_date is null; 

Действие:

Варианты решения этой ошибки Oracle являются: Перепишите триггер/функция, так что он не пытается modify/query за столом PAT в вопросе.

Ссылка

+0

Спасибо Gaurav !!! Я изменю инструкцию select завтра утром, когда я нахожусь на посту, а затем дам вам знать результат. – user1308891

+0

Он работает без проблем! Спасибо Гаураву !!! – user1308891