بتاريخ: 27 مايو 201411 سنة comment_251162 hالسلام عليكم احاول عمل DB trigger على جدول ليس عليه اي كونسترينت يحدث له عمليات insert بشكل يومي علما بأن الريكوردات الجديده احيانا تكون موجوده مسبقا لكن ببيانات قديمة اذا : لو كان رقم الموظف على سبيل المثال موجود مسبقا يتم تعديل البيانات الجديده Update اما لو كان رقم الموظف جديد نضيفة insert جاري معالجه الامر ... وهذه تجربتي التي لم تنجح بعد CREATE OR REPLACE TRIGGER DWH_INS BEFORE INSERT ON EMP1 FOR EACH ROW DECLARE CURSOR COR IS SELECT EMPNO FROM EMP1; VEMP NUMBER; --WHERE EMPNO=:NEW.EMPNO, ; BEGIN FOR I IN COR LOOP SELECT EMPNO INTO VEMP FROM EMP1 WHERE EMPNO = :NEW.EMPNO; IF I.EMPNO = VEMP THEN /*INSERT INTO EMP1 (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME, DNAME1 VALUES (:NEW.EMPNO, :NEW.ENAME, :NEW.JOB, :NEW.MGR, :NEW.HIREDATE, :NEW.SAL, :NEW.COMM, :NEW.DEPTNO; ELSE */ UPDATE EMP1 SET --EMPNO = :NEW.EMPNO, ENAME = :NEW.ENAME, JOB = :NEW.JOB, MGR = :NEW.MGR, HIREDATE = :NEW.HIREDATE, SAL = :NEW.SAL, COMM = :NEW.COMM, DEPTNO = :NEW.DEPTNO WHERE EMPNO = :NEW.EMPNO; END IF; END LOOP; END; INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7369, 'SMITH', 'CLERK', 7902, TO_Date( '12/17/1980 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 800, NULL, 20); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7499, 'ALLEN', 'SALESMAN', 7698, TO_Date( '02/20/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 1600, 300, 30); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7521, 'WARD', 'SALESMAN', 7698, TO_Date( '02/22/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 1250, 500, 30); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7566, 'JONES', 'MANAGER', 7839, TO_Date( '04/02/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 2975, NULL, 20); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7654, 'MARTIN', 'SALESMAN', 7698, TO_Date( '09/28/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 1250, 1400, 30); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7698, 'BLAKE', 'MANAGER', 7839, TO_Date( '05/01/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 2850, NULL, 30); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7782, 'CLARK', 'MANAGER', 7839, TO_Date( '06/09/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 2450, NULL, 10); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7788, 'SCOTT', 'ANALYST', 7566, TO_Date( '04/19/1987 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 3000, NULL, 20); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7839, 'KING', 'PRESIDENT', NULL, TO_Date( '11/17/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 5000, NULL, 10); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7844, 'TURNER', 'SALESMAN', 7698, TO_Date( '09/08/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 1500, 0, 30); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7876, 'ADAMS', 'CLERK', 7788, TO_Date( '05/23/1987 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 1100, NULL, 20); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7900, 'JAMES', 'CLERK', 7698, TO_Date( '12/03/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 950, NULL, 30); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7902, 'FORD', 'ANALYST', 7566, TO_Date( '12/03/1981 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 3000, NULL, 20); INSERT INTO EMP1 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7934, 'MILLER', 'CLERK', 7782, TO_Date( '01/23/1982 12:00:00 Õ', 'MM/DD/YYYY HH:MI:SS AM') , 1300, NULL, 10); COMMIT; تم تعديل 27 مايو 201411 سنة بواسطة omogun تقديم بلاغ
بتاريخ: 27 مايو 201411 سنة comment_251165 IF I.EMPNO = VEMP متهيألي الطبيعي انهم دايما يساووا بعض الكرسور بيجيب اول قيمة ويحطها في المتغير ده واول قيمة الي هي i.empno وبتتحط في المتغير وانت بتقارنهم ببعض يعني هما هما , والله علم تقديم بلاغ
بتاريخ: 28 مايو 201411 سنة comment_251174 السلام عليكم اخي الكريماخي الفاضل : طريقة بناء التريجر نفسه خاطئةحيث انه فى حالة وجود الموظف بسجل مسبقاانت هنا تعمل جملة update على السجل القديم بالبيانات الجديدة ، وهذا يحدث بالفعلولكن يحدث بعد ذلك ايضا انشاء هذا السجل الجديد الذى حدث من عليه انطلاق هذا الtriggerفيكون عندك صفين فى قاعدة البيانات متشابهين تماماصف قديم انت حدثته باليانات الجديدة ، وآخر جديد تم انشاءهيكفيك ببساطة البحث عن سجل يحمل نفس رقم الموظف واذا وجد تحذفه قبل عملية الinsert CREATE OR REPLACE TRIGGER dwh_ins BEFORE INSERT ON emp1 FOR EACH ROW DECLARE CURSOR cor IS SELECT 1 FROM emp1 WHERE empno = :new.empno; v_emp NUMBER; BEGIN OPEN cor; FETCH cor INTO v_emp; IF cor%FOUND THEN DELETE FROM emp1 WHERE empno = :new.empno; CLOSE cor; ELSE CLOSE cor; END IF; END; هذا الكود شغال 100%بالتوفيق تقديم بلاغ
بتاريخ: 29 مايو 201411 سنة كاتب الموضوع comment_251224 جزاك الله الف خير يا mohamedali013 هو ده المطلوب فعلا زي ماقال بيل جيتس Bill Gates — 'I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it.' وشكراو جزاك الله خير لمرورك eslam elbyaly تقديم بلاغ
بتاريخ: 23 يونيو 201411 سنة comment_252323 السلام عليكم عندي مشكلة عندي جدول في رقم الموعد ولا يوجد عليه اي محددات لكن بصير في كثير من الاحيان تكرار وانا بدي اعمل trigger على نفس الجدول يفحص اذا تم تكرار الدور مباشرة يعدل التكرار تقديم بلاغ
بتاريخ: 24 يونيو 201411 سنة comment_252342 السلام عليكم اخي الكريم اذا تم تكرار الدور مباشرة يعدل التكرار ماذا تقصد بتعديل التكرار ؟هل هو كما فى المثال السابق يأخذ قيم جديدة معينة؟ام يوقف عملية الادخال ويعطي رسالة باستخدام raise_application_error ؟ام يحذف السجل القديم؟ تقديم بلاغ
بتاريخ: 24 يونيو 201411 سنة comment_252353 علي فكرة انك تحط primary key لاي جدول تعمله , ده شئ اساسي في اي داتا بيز , (من مبادئها) . ابعد دايما عن انك تعمل جدول من غير مفتاح رئيسي تقديم بلاغ
بتاريخ: 22 يوليو 201411 سنة كاتب الموضوع comment_253088 اخي الكريم المثال فعلا نجح مع بعج الجداول لفتره ولكن يحدث الخطأ (mutating) التالي لبعض الجداول الاخرى ORA-04091: table OWB_TRG.ALL_PRODUCTS_DATA_JUN14 is mutating, trigger/function may not see it ORA-06512: at "OWB_TRG.DWH_INS_JUN14", line 4 ORA-06512: at "OWB_TRG.DWH_INS_JUN14", line 10 ORA-04088: error during execution of trigger 'OWB_TRG.DWH_INS_JUN14' تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.