08.11.2008, 18:10. Показов 13272. Ответов 6
В oracle forms на форме у меня из списка выбирается операция и сответвено каждой операции убераются и появляются поля.Для этого я пременил тригер WHEN-LIST-CHANGED
Oracle 11 SQL | ||
|
при заполнении все работает и при сохранении даные сохроняются.
Но при выполнении запроса к БД выдается ошибка
FRM-40735: POST-OUERY триггер вызвал необработанное ислючение ORA-01403
вот текст POST-OUERY
Oracle 11 SQL | ||
|
Вроде все правелно ктонибуть может сказать в чем дело??????
0
I have a table trigger like below:
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;
--------------------------------------
I have a package which is called by the trigger above, the code for the package is like below:
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;
--------------------------------------
The package body is like below:
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;
--------------------------------------
Each time when Oracle Forms update DOB data, I get error like below:
Oracle Form FRM-40735: ON-ERROR trigger raised unhandled exception ORA-06502
But, when I hard code like below:
select to_date('01-JAN-1980') into p_Date from dual;
to instead of this paragraph code like below, form works fine.
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;
I did replace p_pat_id
to a real value, it pops up a trigger error
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?"
So, how to fix the bug? I can not hard code the date values
#oracle #oracle11g #oracle10g #oracleforms #oracle-fusion-middleware
#Oracle #oracle11g #oracle10g #oracleforms #oracle-fusion-промежуточное ПРОГРАММНОЕ обеспечение
Вопрос:
Я создаю триггер после ВСТАВКИ в блоке, когда получаю эту ошибку в Oracle Forms 11gR2
«FRM-40735: триггер после вставки вызвал необработанное исключение ora-01722»
Код триггера ПОСЛЕ ВСТАВКИ:
Insert into we_group (GROUP_ID, GROUP_SIZE, NRSP_STATUS, GROUP_RECEIVED)
Select DISTINCT GROUP_ID, ('Select COUNT(*) from we_group_hof_k'),
nrsp_status, sysdate
from we_group_hof_k;
commit_form;
Как решить эту проблему?
Ответ №1:
Удалить ‘, чтобы предотвратить преобразование числа в символ
Select DISTINCT GROUP_ID, (select COUNT(*) from we_group_hof_k),
nrsp_status, sysdate
from we_group_hof_k;
Ответ №2:
Рассмотрите возможность использования аналитической версии COUNT
функции (если используемая вами версия Forms поддерживает ее; 10g этого не делает, я не могу сказать о 11g):
INSERT INTO we_group (GROUP_ID,
group_size,
nrsp_status,
group_received)
SELECT DISTINCT GROUP_ID,
COUNT (*) OVER (ORDER BY NULL),
nrsp_status,
SYSDATE
FROM we_group_hof_k;
Ответ №3:
Очевидно ORA-01722
, что оно возникает из-за попытки вставить строку в кавычках
( 'Select COUNT(*) from we_group_hof_k'
) в числовой столбец ( GROUP_SIZE
).
Итак, прежде всего, вам нужно избавиться от этих кавычек и даже целого подвыбора, поскольку вы уже пытаетесь выбрать из той же таблицы в основном запросе, и просто подумайте о том, чтобы group by
вместо этого включить предложение:
Insert Into we_group(group_id, group_size, nrsp_status, group_received)
Select group_id,Count(1),nrsp_status, sysdate
From we_group_hof_k
Group By group_id,nrsp_status;
Наконец, не используйте commit
или commit_form
внутри POST-INSERT
триггера, это использование считается незаконным, ограниченным там.
This is Forms; if you meant to use the ampersand (&) like in SQL*Plus, well, you’re very wrong as Forms don’t work that way. You should create form items, let users populate their values, and then store those values into the database.
The error you got is because you’re inserting strings into some number columns; the most obvious is the PRICE — that is, most probably, a NUMBER data type column, and you’re putting &price into it, literally.
The most usual way is to use the Data Block Wizard, base the block on the BOOK table, and Forms would create everything for you — you’d just run the form, put some values into those items and commit.
The way you’re doing it now, it seems that you want to use a control block, i.e. the one that isn’t based on an underlying database object (such as a table or a view), so you have to create your own INSERT logic — I’d suggest you not to do that. But, if you insist, then the trigger would look like this:
begin
insert into book
values (:a, :b, :c, :d);
EXCEPTION
when VALUE_ERROR then
message('VALUE_ERROR exception raised');
raise form_trigger_failure;
end;
- reference items with the colon sign (I’d also suggest you to always reference them using the block and the item name, such as
:block.item_name
) - DBMS_OUTPUT.PUT_LINE won’t work in Forms
У меня есть триггер таблицы, как показано ниже:
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 Forms обновляет данные DOB, я получаю ошибку, как показано ниже:
Oracle Form FRM-40735: триггер ON-ERROR вызвал необработанное исключение 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?"
Итак, как исправить ошибку? Я не могу жестко закодировать значения даты
Ошибка:
ORA-04091: имя таблицы изменяется, триггер / функция может не видеть его /
Ваша ошибка
trigger error:"ORA-04091: table TGLN.PAT is mutating
Причина:
Оператор выполнил триггер или пользовательскую функцию 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
.
Ссылка
-
Ошибка ORA-04091
-
ORA-04091: table [blah] мутирует, триггер / функция могут его не видеть
1
Community
23 Май 2017 в 15:04