vantage
Дата: 09.08.2005 12:22:56
есть тригерр
create or replace trigger quickstart.quickstart.ACRIONS_COMMIT_TR
after update on quickstart.actions
for each row
необходимо чтобы он вызывал процедуру, а в этой процедуре выполнялся select к этой таблице (откуда был вызван тригеер).
Подскажите как это реализовать.
ORACLE ругается
Wolfon Stromboy
Дата: 09.08.2005 12:37:35
процедуре автономные транзакции надо использовать
vantage
Дата: 09.08.2005 12:44:01
каким образом реализовываются автономные транзакции?
у меня такой select
select count(a.id) into rc from quickstart.actions a where a.dt_id = dt_id_ and a.proceed = 1;
quickstart.actions таблица из которой был вызван тригерр
Oleg Afanasiev
Дата: 09.08.2005 12:46:35
Грязно?
Джин Нодар :: История моего самоубийства |
... Когда водка в бутылке вышла, Гена вдруг грязно выругался в адрес всех штатов Америки и стукнул кулаком по пустой тарелке. ...
|
Wolfon Stromboy
Дата: 09.08.2005 12:56:32
Что-то типа:
Create or replace function SelectFunc return number is
pragma autonomous_transaction;
Result number;
Begin
select count(a.id)
into Result
from quickstart.actions a
where a.dt_id = dt_id_ and a.proceed = 1;
commit;
Return Result;
End;
/ |
vantage
Дата: 09.08.2005 13:16:25
спасибо, вроде заработало
Sergey Balter
Дата: 09.08.2005 13:23:24
1) Обход проблемы через автономные транзакции возможен, только если ты осознаешь как они работают.
Например, если выполнить такую последовательность действий:
update quickstart.actions set proceed=1
защитит ли вариант триггера ч/з автономные транзакции от ошибки?
Оракл-то не ругается, но достигается ли твоя цель?
2) Исходная задача - обеспечить контроль целостности? Может, лучше уникальный функциональный индекс применить?
Vint
Дата: 09.08.2005 13:43:22
Может все таки автор топика напишет ошибку, потому как смысла применять в данном случае автономные транзакции может быть и нет, а есть смысл подправить синтаксис, желательно кусок триггера который ругаеться тож привести
vantage
Дата: 09.08.2005 14:00:08
задача следующая есть таблица
create table QUICKSTART.ACTIONS
(
ID NUMBER(19) not null,
USER_ID NUMBER(19),
DT_ID NUMBER(19),
CONTENT VARCHAR2(255),
CREATIONDATE DATE,
ACTIVATIONDATE DATE,
PROCEED NUMBER(1),
TYPE NUMBER(10) default 0,
CODE1 NUMBER(10) default 0,
CODE2 NUMBER(10) default 0,
CODE3 NUMBER(10) default 0,
CODE4 NUMBER(10) default 0
)
необходимо отловить событие,
когда для всех записей у которых значение поля DT_ID сопадают (DT_ID это FK из другой таблицы)
И если у этих записей по одинаковому DT_ID , значение поля PROCEED =1
То необходимо произвести update (поставить COMMITED:=1 )
записи в таблице DOCTRANSACTIONS
create table QUICKSTART.DOCTRANSACTIONS
(
ID NUMBER(19) not null,
COMMITED NUMBER(1),
TRANSFERDATE DATE,
DOCPAS_ID NUMBER(19),
STREAM_ID NUMBER(19)
)
у которой DOCTRANSACTIONS.ID = ACTIONS.DT_ID
При update срабатывает следующий тригерр
create or replace trigger quickstart.ACRIONS_COMMIT_TR
after update on quickstart.actions
for each row
declare
-- local variables here
rc number ;
v number;
begin
--commit;
v:=:new.dt_id;
quickstart.actions_commit(v);
end ACRIONS_COMMIT_TR;
вызываемая тригерром процедура
create or replace procedure quickstart.ACTIONS_COMMIT(dt_id_ number) is
pragma autonomous_transaction;
dt_id number;
rc number;
begin
select count(a.id) into rc from quickstart.actions a where a.dt_id = dt_id_ and a.proceed = 0;
if rc=0 then
update quickstart.doctransactions dtra set commited = 1 where dtra.id = dt_id_;
end if;
dt_id:=1 ;
commit;
end ACTIONS_COMMIT;
путано конечно
Vint
Дата: 09.08.2005 14:05:59
ну а что вам мешало выполнить этот запрос и UPDATE в теле триггера ??? по моему все должно выполниться и заапдейтиться навпишите ошибку плз, а что будет если у вас будет множественный апдейт и пойдет откат, ваш коммит может повлеч за собой множество ошибок.