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

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

خطاء رقم ORA04091


4 رد (ردود) على هذا الموضوع

#1 decent

decent

    عضو

  • الأعضــاء
  • 15 مشاركة

تاريخ المشاركة 10 January 2005 - 03:07 PM

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

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;
وعند التعديل في الحقل المعني يقع هذا الخطاء ارجو من الاخوة الاعزاء افادتي في كيفية حل هذه المشكلة
وفقكم الله

ملفات مرفقة

  • ملف مرفق  OraErr.JPG   16.73كيلو   53 عدد مرات التحميل

تم التعديل بواسطة decent, 11 January 2005 - 01:37 PM.


#2 Amgad

Amgad

    مشرف عام ومشرف قسم تحليل النظم

  • الفريق الإداري
  • 4,559 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 11 January 2005 - 04:38 PM

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

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

.

لا إله إلا الله الحليم الكريم
لا اله إلا الله العلى العظيم
لا اله إلا الله رب السماوات السبع و رب العرش العظيم
‏اللهم ارزقني قبل الموت توبة وعند الموت شهادة وبعد الموت جنة
اللهم ارزقني حسن الخاتمة
اللهم هون علينا سكرات الموت ... ونور علينا قبورنا
اللهم ارزقني الموت وأنا ساجد لك يا ارحم الراحمين
اللهم ثبتني عند سؤال الملكين
اللهم اجعل قبري روضة من رياض الجنة ولا تجعله حفرة من حفر النار
اللهم اني اعوذ بك من فتن الدنيا
اللهم ارحم ابائنا وامهاتنا واغفر لهما وتجاوز عن سيئاتهما وادخلهم فسيح جناتك ... والحقنا بهما يا رب العالمين
اللهم ارحم موتانا وموتى المسلمين واشفي مرضانا ومرضى المسلمين
اللهم اغفر للمسلمين والمسلمات والمؤمنين والمؤمنات الأحياء منهم والأموات
وبارك اللهم على سيدنا محمد صلى الله عليه وسلم
اللهم آمين ... اللهم آمين ... اللهم آمين


....


#3 decent

decent

    عضو

  • الأعضــاء
  • 15 مشاركة

تاريخ المشاركة 16 January 2005 - 04:16 PM

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

#4 Amgad

Amgad

    مشرف عام ومشرف قسم تحليل النظم

  • الفريق الإداري
  • 4,559 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 17 January 2005 - 12:34 AM

السلام عليكم ورحمه الله ،،
الاخ / 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;

لا إله إلا الله الحليم الكريم
لا اله إلا الله العلى العظيم
لا اله إلا الله رب السماوات السبع و رب العرش العظيم
‏اللهم ارزقني قبل الموت توبة وعند الموت شهادة وبعد الموت جنة
اللهم ارزقني حسن الخاتمة
اللهم هون علينا سكرات الموت ... ونور علينا قبورنا
اللهم ارزقني الموت وأنا ساجد لك يا ارحم الراحمين
اللهم ثبتني عند سؤال الملكين
اللهم اجعل قبري روضة من رياض الجنة ولا تجعله حفرة من حفر النار
اللهم اني اعوذ بك من فتن الدنيا
اللهم ارحم ابائنا وامهاتنا واغفر لهما وتجاوز عن سيئاتهما وادخلهم فسيح جناتك ... والحقنا بهما يا رب العالمين
اللهم ارحم موتانا وموتى المسلمين واشفي مرضانا ومرضى المسلمين
اللهم اغفر للمسلمين والمسلمات والمؤمنين والمؤمنات الأحياء منهم والأموات
وبارك اللهم على سيدنا محمد صلى الله عليه وسلم
اللهم آمين ... اللهم آمين ... اللهم آمين


....


#5 ahmedghaly

ahmedghaly

    مشترك

  • الأعضــاء
  • 74 مشاركة
  • الاسم الأول:Ahmed
  • اسم العائلة:Abo Ghaly
  • البـلـد: Country Flag

تاريخ المشاركة 25 December 2013 - 05:36 AM

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

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

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

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