Syrian Oracle بتاريخ: 9 فبراير 2010 تقديم بلاغ مشاركة بتاريخ: 9 فبراير 2010 السلام عليكم أرجو منكم المساعدة في تعديل التريجر ، فعندما اقوم بعمل create فانه لا يظهر اي اخطاء او تحذيرات .ولكن عندما اقوم بعملية ادخال حسب الشروط الموجودةفانه يعطينا رسالة الخطأ التالية : Database error number 1 has occurred when operating on WOSTATUS WOSTATUSID=11,587.ORA-00001: unique constraint (MAXIMO.TKSTATUS_NDX) violatedORA-06512: at "MAXIMO.SR_STATUS", line 24ORA-04088: error during execution of trigger 'MAXIMO.SR_STATUS ' [left]CREATE OR REPLACE TRIGGER SR_STATUS AFTER INSERT ON WOSTATUS REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW ---------------------- DECLARE CURSOR WO_CUR IS SELECT WONUM, STATUS, ORIGRECORDID FROM WORKORDER WHERE ORIGRECORDID = (SELECT ORIGRECORDID FROM WORKORDER WHERE WONUM =:NEW.WONUM) ; v1 number(2) ; o1 number(10) ; --X1 NUMBER(10) ; -------------------------------- BEGIN --select TKSTATUSSEQ.nextval INTO X1 FROM DUAL ; -------------------------- SELECT count(distinct STATUS) INTO v1 FROM WORKORDER WHERE ORIGRECORDID = (SELECT ORIGRECORDID FROM WORKORDER WHERE WONUM = :new.wonum) ; ---------------------------------- --select ORIGRECORDID into o1 from workorder where wonum = :NEW.WONUM ; --------------------------------- IF :NEW.STATUS = 'CLOSE' and v1 =1 THEN FOR WO_REC IN WO_CUR LOOP IF WO_REC.STATUS = 'CLOSE' AND WO_REC.ORIGRECORDID IS NOT NULL THEN UPDATE TICKET SET STATUS = 'CLOSED', changedate= sysdate WHERE TICKETID = WO_REC.ORIGRECORDID ; [b] [u]INSERT INTO TKSTATUS ( TICKETID,CLASS,STATUS,CHANGEBY,CHANGEDATE,TKSTATUSID )[/b] [b] VALUES( '1031', 'SR','CLOSED', 'MAXADMIN', SYSDATE, TKSTATUSSEQ.nextval );[/b] [/u] END IF ; END LOOP ; END IF; END SR_STATUS ; /[/left] علما بأني عندما اقوم بتنفيذ الادخال بشكل منفصل فانه يقبل ذلك أرجو المساعدة وجزاكم الله خيرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mostfa_future بتاريخ: 9 فبراير 2010 تقديم بلاغ مشاركة بتاريخ: 9 فبراير 2010 IF :NEW.STATUS = 'CLOSE' and v1 =1 THEN FOR WO_REC IN WO_CUR LOOP IF WO_REC.STATUS = 'CLOSE' AND WO_REC.ORIGRECORDID IS NOT NULL THEN UPDATE TICKET SET STATUS = 'CLOSED', changedate= sysdate WHERE TICKETID = WO_REC.ORIGRECORDID ; INSERT INTO TKSTATUS ( TICKETID,CLASS,STATUS,CHANGEBY,CHANGEDATE,TKSTATUSID ) VALUES( '1031', 'SR','CLOSED', 'MAXADMIN', SYSDATE, TKSTATUSSEQ.nextval ); END IF ; END LOOP ; END IF; END SR_STATUS ; المشكله فى القطعه دى تاكد اخى الفاضل ان جمل UPDATE و انسيرت تكون مطبوطه من ناحيه الكونسترين و عشان تاكد قبل ماتنفذ انسيرت خد قيم الى مقروض التريجر يعملها فى الجدوال دىTICKET ونفذها بعيد عن التريجر وشوف هتنفذ ولا لا اكيد انت حططكونسترين معين ومش واخد بالك لو موسلتش لحاجه يارت تعمل DESC لجدوال عشان نقدر نساعدك وربنا معاك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Syrian Oracle بتاريخ: 10 فبراير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 10 فبراير 2010 أخي المشكلة في في تعليمة Update لأنه عندما اقوم الغيها من التريجر واقوم بتنفيذه لا اواجه اي مشكلة ولكن عندما اضيفها للتريجر فانه يعطيني خطا بالتنفيذهل انا قادر على استخدام KSTATUSSEQ.nextval بداخل التريجر ام ان هناك طريقة اخرى لاستخدامها وتنفيذ عملية الادخال ؟؟؟وشكراجزيلا على اهتمامكم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mostfa_future بتاريخ: 10 فبراير 2010 تقديم بلاغ مشاركة بتاريخ: 10 فبراير 2010 (معدل) هل انت جربت الجماه من غير ماتستخدم KSTATUSSEQ.nextval اى انك تدخل القيمه يدوى من غير سيكزنس واشتغلت لو اشتغلت ممكن تعمل بروستدر يحمل اى فريبول بقيمه KSTATUSSEQ.nextva وتعملها كول داخال التريجر وتستخدم الفريبول بدل من KSTATUSSEQ.nextvaبس انا مفتكرش ان ده السبب لان سيكونس مكن تستخدما فى اى مكان بدل انت عملها على نفس السكيمه على عموم ركز عاى ان جمله Update مش بتنتهك اى كونستران وبالتوفيق تم تعديل 10 فبراير 2010 بواسطة mostfa_future اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Syrian Oracle بتاريخ: 10 فبراير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 10 فبراير 2010 عفوا اخي الكريم في المشاركة سبقت قصدت ان المشكلة ليست من update بل المشكلة من insert فعندما الغي تعليمة insert و ابقي على جملة update فقط فان التريجر لا يعطيني اي رسالة خطأ عند التطبيق ولكن عند اضافة Insert فانه يعطيني الرسالة السابقة وبنفس الوقت عندما اقوم بتنفيذ نفس تعليمة ال insert بشكل منفصل فانها تقبل ذلك ولا تعطيني اي خطأ اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mostfa_future بتاريخ: 10 فبراير 2010 تقديم بلاغ مشاركة بتاريخ: 10 فبراير 2010 INSERT INTO TKSTATUS ( TICKETID,CLASS,STATUS,CHANGEBY,CHANGEDATE,TKSTATUSID )VALUES( '1031', 'SR','CLOSED', 'MAXADMIN', SYSDATE, TKSTATUSSEQ.nextval ); تاكد من كل الكونستران الى موجد على الجدول البداخل فى البيانات لان رساله الخطاء متعلقه بنتهاك كونسترين اسمه MAXIMO.TKSTATUS_NDXORA-00001: unique constraint (MAXIMO.TKSTATUS_NDX) violatedاكيد الكولم ده STATUS نت حطط عليه كونسترين unique اتاكد من كل كنوسترين الى موجد على الجدوال لو موصلتش لحاجه ابعت لينا DESC لجدوال عشان نقدر نساعدك و بالتوفيق اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Syrian Oracle بتاريخ: 11 فبراير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 11 فبراير 2010 عزيزي مصطفى هذه الكونستراينت الموجودة على الجدول والتريجر الموجود عليه select INDEX_OWNER,INDEX_NAME,TABLE_OWNER,TABLE_NAME,COLUMN_NAME,COLUMN_POSITION from all_ind_columns where index_name='TKSTATUS_NDX'; INDEX_OWNER INDEX_NAME TABLE_OWNER TABLE_NAME COLUMN_NAME COLUMN_POSITION MAXIMO TKSTATUS_NDX MAXIMO TKSTATUS TKSTATUSID 1 select INDEX_OWNER,INDEX_NAME,TABLE_OWNER,TABLE_NAME,COLUMN_NAME,COLUMN_POSITION from all_ind_columns where index_name='TKSTATUS_NDX1'; INDEX_OWNER INDEX_NAME TABLE_OWNER TABLE_NAME COLUMN_NAME COLUMN_POSITION MAXIMO TKSTATUS_NDX1 MAXIMO TKSTATUS TICKETID 1 1 MAXIMO TKSTATUS_NDX1 MAXIMO TKSTATUS CLASS 2 MAXIMO TKSTATUS_NDX1 MAXIMO TKSTATUS STATUS 3 MAXIMO TKSTATUS_NDX1 MAXIMO TKSTATUS CHANGEDATE 4 CREATE OR REPLACE TRIGGER "MAXIMO".TKSTATUS_T BEFORE INSERT OR UPDATE ON TKSTATUS FOR EACH ROW DECLARE NEXTVAL INTEGER; BEGIN SELECT MAXSEQ.NEXTVAL INTO NEXTVAL FROM DUAL; :NEW.ROWSTAMP := NEXTVAL; END; ولكم جزيل الشكر اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mostfa_future بتاريخ: 11 فبراير 2010 تقديم بلاغ مشاركة بتاريخ: 11 فبراير 2010 استخدم الجمله دى عشان تعرض الكونسترين SELECT constraint_name , constraint_type FROM user_constraints WHERE table_name = 'اسم الجدول الى بيعمل مشكاه فى الانسريت' ;وهات الناتج بتاعه بالتوفيق اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Syrian Oracle بتاريخ: 13 فبراير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 13 فبراير 2010 [left]SELECT constraint_name , constraint_type FROM user_constraints WHERE table_name = 'TKSTATUS' ; [/left] CONSTRAINT_NAME CONSTRAINT_TYPESYS_C006387 CSYS_C006388 CSYS_C006389 CSYS_C006390 CSYS_C006391 CSYS_C006392 CSYS_C006393 C اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mostfa_future بتاريخ: 13 فبراير 2010 تقديم بلاغ مشاركة بتاريخ: 13 فبراير 2010 SELECT constraint_name , constraint_typeFROM user_constraintsWHERE constraint_name = 'MAXIMO.TKSTATUS_NDX ' ;وجرب شوف هيطلع كونستران بالاسم ده مع مرعاء انك تكتب اسم الكونستران كابتلوبعدين تاكد انك مدى قيمه لكل قبم الجدول لان عندك 7 كونستران TYPE بتاعهم c يعنى لما CHECK او NOT NULL فلو 7 كلهم NOT NULL فانت عامل فى الانسريت 6 قيم بس ممكنتكون المشكله هنا و بالتوفيق اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Syrian Oracle بتاريخ: 16 فبراير 2010 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 16 فبراير 2010 أخي مصطفى المشكلة كانت بالكرسر وذلك لأنه يقوم بادخال نفس القيمة مرتين وهذا ما يجعله يخترق القيود الموجودة وهذا هو الحل للمشكلة شكرا جزيلا على تعاونكم وجهودكم CREATE OR REPLACE TRIGGER MAXIMO.SR_STATUS AFTER INSERT ON MAXIMO.WOSTATUS REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW -------------------------------- DECLARE V1 number(2) ; O1 number(10) ; TKTID number (10); -------------------------------- BEGIN SELECT ORIGRECORDID INTO TKTID FROM WORKORDER WHERE WONUM = :NEW.WONUM; SELECT COUNT(ORIGRECORDID) INTO O1 FROM WORKORDER WHERE ORIGRECORDID =TKTID; SELECT COUNT(DISTINCT STATUS) INTO V1 FROM WORKORDER WHERE ORIGRECORDID =TKTID; -------------------------------- IF :NEW.STATUS='CLOSE' and O1>1 AND V1=1 THEN UPDATE TICKET SET STATUS = 'CLOSED', changedate = sysdate WHERE TICKETID = TKTID ; ----------------- INSERT INTO TKSTATUS (TICKETID,CLASS,STATUS,CHANGEBY, CHANGEDATE,MEMO,SITEID,ORGID,TKSTATUSID,ROWSTAMP) VALUES(TKTID, 'SR', 'CLOSED', 'MAXADMIN', SYSDATE, NULL, NULL, NULL, TKSTATUSSEQ.nextval, '1') ; ----------------- END IF ; -------------------------------- END SR_STATUS ; / -------------------------------- اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.