الانتقال إلى المحتوى

خطاء رقم ORA04091


decent

Recommended Posts

الاخوة الاغزاء السلام عليكم و رحمة الله و بركاته
عندي جدول وهو

CREATE TABLE ACCOUNTS
(
ACCOUNTID NUMBER (10,0) NOT NULL,
ACCOUNTNAME VARCHAR2 (100 ) NOT NULL,
MAINACOUNTID NUMBER (10,0) DEFAULT 0 NOT NULL,
ACCOUNTTYPE VARCHAR2 (5 ) NOT NULL,
ACCOUNTKIND VARCHAR2 (5 ) NOT NULL,
OPENBALANCE NUMBER (15,2) DEFAULT 0 NOT NULL,
OPENBALANCETYPE VARCHAR2 (6 ),
OPENDATE DATE NOT NULL,
LASTACCOUNTS VARCHAR2 (5 ),
CR NUMBER (20,2),
DR NUMBER (20,2)
)
وقد قمت بانشاء تريقر وهو

CREATE OR REPLACE TRIGGER ACCOUNTS_BIUDR
BEFORE UPDATE
OF ACCOUNTTYPE
ON ACCOUNTS

FOR EACH ROW

DECLARE

RES integer;
EXP_ERR EXCEPTION;

BEGIN
IF UPDATING THEN

IF :OLD.ACCOUNTTYPE = 'MAIN' THEN

SELECT count(*) INTO RES FROM ACCOUNTS
WHERE MAINACOUNTID = :OLD.ACCOUNTID;

IF RES > 0 THEN
RAISE EXP_ERR;
END IF;
END IF;

END IF;

EXCEPTION WHEN EXP_ERR THEN
RAISE_APPLICATION_ERROR(-20000,'رسالة الخطاء');
END;
وعند التعديل في الحقل المعني يقع هذا الخطاء ارجو من الاخوة الاعزاء افادتي في كيفية حل هذه المشكلة
وفقكم الله

post-5-1105358877_thumb.jpg

تم تعديل بواسطة decent
رابط هذا التعليق
شارك

السلام عليكم ،،

ORA-04091 table string.string is mutating, trigger/function may not see it


Cause: A trigger (or a user defined PL/SQL function that is referenced in this
statement) attempted to look at (or modify) a table that was in the middle of
being modified by the statement which fired it.
Action: Rewrite the trigger (or function) so it does not read that table

.

رابط هذا التعليق
شارك

السلام عليكم و رحمة الله و بركاته
اخي الكريم Amgad شكراً لك على الرد و جزاك الله خير
لقد أعد كتابة التريقر مرة اخرة و اعطاني نفس الخطاء بل قمت بحزفة و كتابته مرة اخرة ولاكن اعطاني نفس الخطاء
اخي الكريم لو في حلول اخرى ارجو افادتي بها

رابط هذا التعليق
شارك

السلام عليكم ورحمه الله ،،
الاخ / decent
اعتقد ان سبب الخطأ هو انه اثناء تنفيذ الTRIGGER أي عند حدوث تعديل فى الجدول ACCOUNTS ..
فانه لايجوز ان تستخدم نفس الجدول داخل الTRIGGER مع امر
SELECT COUNT(*) FROM ACCOUNTS
لان حالة الجدول غير محدده .. هل تم التعديل فيه ام لا ؟؟ فكيف يمكن اجراء امر SELECT >>
ارجوا ان تكون الفكرة .. وصلت اليك .. عموما اقترح عليك التعديل التالي فى الTRIGGER

CREATE OR REPLACE TRIGGER ACCOUNTS_BIUDR
BEFORE UPDATE
OF ACCOUNTTYPE
ON ACCOUNTS
FOR EACH ROW
DECLARE
RES integer;
EXP_ERR EXCEPTION;
BEGIN IF UPDATING THEN
IF :OLD.ACCOUNTTYPE = 'MAIN' THEN
RAISE EXP_ERR;
END IF;
END IF;
EXCEPTION WHEN EXP_ERR THEN
RAISE_APPLICATION_ERROR(-20000,'ERROR ERROR ERROR');
END;

رابط هذا التعليق
شارك

  • بعد 8 سنة...

السلام عليكم ورحمة الله وبركاته

اعتقد ان الخطاء هو في
FOR EACH ROW
لأنه لا يمكن استخدام DML في وجودها

لذلك اما ان تحذف FOR EACH ROW او SELECT

وان شاء الله تتحل المشكلة



 

رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية