ورود

View Full Version : Trigger - Mutating - Package



ir_programmer
سه شنبه 02 بهمن 1386, 09:24 صبح
من یه Trigger بشکل زیر دارم:


CREATE OR REPLACE TRIGGER table1_after_update
AFTER UPDATE
ON table1
FOR EACH ROW

DECLARE
mQty number;

BEGIN

SELECT Qty INTO mQty from table1
where Field2=550;

Update table2 set RecievedQty=mQty
Where CurrentDate=:New.CurrentDate ;

END;


چون توی After Update مربوط به جدول table1 من کد select از همین جدول نوشتم ، وقتی Trigger اجرا میشه توی Run Time خطای mutating میده.

ظاهرا مشکل من با package حل میشه.
حالا یه سوال دارم. راه حل ساده تری هم داره؟
اگه راه حل دیگه ای نیست ، من چطوری باید از package برای حل این مشکل استفاده کنم؟
کد package رو چطور بنویسم؟ اگر میشه راهنماییم کنید.

aidin300
سه شنبه 02 بهمن 1386, 11:42 صبح
قبلا همین موضوع بحث شده بود.تاپیک مشکل با تریگر (http://barnamenevis.org/forum/showthread.php?t=79065)رو ببین

ir_programmer
سه شنبه 02 بهمن 1386, 12:04 عصر
قبلا همین موضوع بحث شده بود.تاپیک مشکل با تریگر (http://barnamenevis.org/forum/showthread.php?t=79065)رو ببین

میدونم بحث شده.
اما توی سوالم هم گفتم که مشکل با package حل میشه. اما چطوری؟
تو اون تایپیک هم فقط اشاره ای شده. حل رو مطرح نکردن!

aidin300
چهارشنبه 03 بهمن 1386, 11:28 صبح
تو پست 5ام اون تاپیک دو تا لینک گذاشته بودم مشکلت رو حل نکرد؟ دوباره یه نگاهی به این لینک بنداز Mutating Table Exceptions (http://www.oracle-base.com/articles/9i/MutatingTableExceptions.php)

ir_programmer
چهارشنبه 03 بهمن 1386, 13:15 عصر
اگه میشه کد رو واسم بنویسید.
من اون مطلب رو خوندم. اما نتوستم درستش کنم.
مثالم رو بالا نوشتم.
کد پکیج رو واسم بنویسید. اگه لطف کنید.

ir_programmer
دوشنبه 08 بهمن 1386, 14:12 عصر
کسی میتونه کمک کنه؟!

aidin300
دوشنبه 08 بهمن 1386, 20:16 عصر
سلام
کد زیر رو با استفاده از این مقاله نوشتم. Avoiding Mutating Tables (http://asktom.oracle.com/tkyte/Mutate/index.html) امیدوارم کار کنه، من تست نکردم اگه جایی مشکل داشت خبرم کن
کد Package


create or replace package state_pkg as
type rowidArray is table of rowid index by binary_integer;
newRows rowidArray;
empty rowidArray;
end;

کد جداول


CREATE TABLE TABLE1
(
FIELD2 NUMBER,
QTY NUMBER,
CURRENTDATE DATE
);

CREATE TABLE TABLE1TRACE
(
FIELD2 NUMBER,
QTY NUMBER,
CURRENTDATE DATE
);

CREATE TABLE TABLE2
(
RECIEVEDQTY NUMBER,
CURRENTDATE DATE
);

کد Triggers


create or replace trigger table1_after_insertupdate
after insert or update on table1
declare
myCURRENTDATE date;
mQty number;
begin
delete from table1trace;
for i in 1 .. state_pkg.newRows.count loop
insert into table1trace
select field2, qty, CURRENTDATE
from table1
where rowid = state_pkg.newRows(i);
end loop;

SELECT Qty, CURRENTDATE
INTO mQty, myCURRENTDATE
from table1trace
where Field2 = 550;

Update table2 set RecievedQty = mQty Where CurrentDate = myCURRENTDATE;

end;

create or replace trigger table1_after_iu_ferow
after insert or update on table1
for each row

begin
state_pkg.newRows(state_pkg.newRows.count + 1) := :new.rowid;
end;

create or replace trigger table1_before_insertupdate
before insert or update on table1

begin
state_pkg.newRows := state_pkg.empty;
end;

ir_programmer
سه شنبه 09 بهمن 1386, 15:49 عصر
ممنونم دوست عزیزم.
این مشکل رو من با کد توی دات نت حل کردم.
اما حتما اگر دوباره برخوردم تست می کنم.
راه حل package درسته.
بازم ممنونم.