بتاريخ: 3 يناير 201016 سنة comment_181263 السلام على من اتبع الهدى CREATE OR REPLACE PROCEDURE CHECK_SALARY(V_JOB_ID VARCHAR2 , V_SAL NUMBER ) IS yy NUMBER ; V_MIN_SALARY NUMBER ; V_MAX_SALARY NUMBER ; invalid_JOB_ID EXCEPTION; invalid_salary EXCEPTION; CURSOR emp_cursor iS SELECT MIN_SALARY ,MAX_SALARY from JOBS WHERE JOB_ID = V_JOB_ID ; BEGIN SELECT MIN_SALARY into yy from JOBS WHERE JOB_ID = V_JOB_ID ; OPEN emp_cursor; LOOP EXIT WHEN emp_cursor%NOTFOUND; FETCH emp_cursor INTO V_MIN_SALARY, V_MAX_SALARY; end loop; iF v_sal NOT BETWEEN V_MIN_SALARY AND V_MAX_SALARY THEN RAISE invalid_salary; end IF ; EXCEPTION WHEN invalid_salary THEN DBMS_OUTPUT.PUT_LINE('Invalid salary'|| v_saL ||' Salaries for job' ||V_JOB_ID|| 'must be between' || V_MIN_SALARY|| 'and' || V_MAX_SALARY); WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE( 'invalid_JOB_ID NO EMPLOYY ' ||V_JOB_ID); END ; *********************************************** CREATE OR REPLACE TRIGGER CHECK_SALARY_TRG BEFORE UPDATE or INSERT OF salary, job_id ON employees FOR EACH ROW BEGIN IF INSERTING then check_salary(:NEW.job_id, :NEW.salary); ELSIF UPDATING('SALARY') then check_salary(:old.job_id, :NEW.salary); ELSIF UPDATING('job_id') then check_salary(:NEW.job_id, :old.salary); end if; end; TRIGGER شغال ومفيش مشكله وبيطلع الارسائل بس حتى لو فى مشكله فى السعر يطلع الرسائل ويسجل بردك السعر الجديد انا عايزو يلغى ادخال او تعديل السعر لو مش مظبوط وبطلع الرساله تقديم بلاغ
بتاريخ: 3 يناير 201016 سنة comment_181281 استخدم Raise_Application_Error(-20100,''); ده هيعمل اكسبشن و يوقف الكوميت علي الداتا بيز وبالتالي العمليه كلها هيتعمل رول باك عليها وممكن تحط الرساله الي عاوزها بين الكوت وبتظهر علي مستوي الابلكيشن تحياتي تقديم بلاغ
بتاريخ: 4 يناير 201016 سنة كاتب الموضوع comment_181361 اخى الفاضل نا حاولت استخدام اليرور بتاعك ومعملش حاجه كتابته بهذه الطريقه CREATE OR REPLACE PROCEDURE CHECK_SALARY(V_JOB_ID VARCHAR2 , V_SAL NUMBER ) IS yy NUMBER ; V_MIN_SALARY NUMBER ; V_MAX_SALARY NUMBER ; insert_excep EXCEPTION; PRAGMA EXCEPTION_INIT (insert_excep,-20100); invalid_salary EXCEPTION; CURSOR emp_cursor iS SELECT MIN_SALARY ,MAX_SALARY from JOBS WHERE JOB_ID = V_JOB_ID ; BEGIN SELECT MIN_SALARY into yy from JOBS WHERE JOB_ID = V_JOB_ID ; OPEN emp_cursor; LOOP EXIT WHEN emp_cursor%NOTFOUND; FETCH emp_cursor INTO V_MIN_SALARY, V_MAX_SALARY; end loop; iF v_sal NOT BETWEEN V_MIN_SALARY AND V_MAX_SALARY THEN RAISE invalid_salary; RAISE insert_excep; end IF ; EXCEPTION WHEN invalid_salary THEN DBMS_OUTPUT.PUT_LINE('Invalid salary'|| v_saL ||' Salaries for job' ||V_JOB_ID|| 'must be between' || V_MIN_SALARY|| 'and' || V_MAX_SALARY); WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE( 'invalid_JOB_ID NO EMPLOYY ' ||V_JOB_ID); WHEN insert_excep THEN DBMS_OUTPUT.PUT_LINE( 'invalid update '); END ; / show errors ارجو التوضيح اليرور وتعديل الكود بتاعى باليرور للتوضيح وشكراااااااااا تقديم بلاغ
بتاريخ: 4 يناير 201016 سنة comment_181369 استخدمته فين مش شايف الكود الي كتبته اكتبه تحت ال دي بي ام اس علي طول بنفس السينتكس الي كاتبتها انا تقديم بلاغ
بتاريخ: 4 يناير 201016 سنة كاتب الموضوع comment_181411 CREATE OR REPLACE PROCEDURE CHECK_SALARY(V_JOB_ID VARCHAR2 , V_SAL NUMBER ) IS yy NUMBER ; V_MIN_SALARY NUMBER ; V_MAX_SALARY NUMBER ; insert_excep EXCEPTION; PRAGMA EXCEPTION_INIT (insert_excep,-20100); invalid_salary EXCEPTION; CURSOR emp_cursor iS SELECT MIN_SALARY ,MAX_SALARY from JOBS WHERE JOB_ID = V_JOB_ID ; BEGIN SELECT MIN_SALARY into yy from JOBS WHERE JOB_ID = V_JOB_ID ; OPEN emp_cursor; LOOP EXIT WHEN emp_cursor%NOTFOUND; FETCH emp_cursor INTO V_MIN_SALARY, V_MAX_SALARY; end loop; iF v_sal NOT BETWEEN V_MIN_SALARY AND V_MAX_SALARY THEN RAISE invalid_salary; end IF ; EXCEPTION WHEN invalid_salary THEN DBMS_OUTPUT.PUT_LINE('Invalid salary'|| v_saL ||' Salaries for job' ||V_JOB_ID|| 'must be between' || V_MIN_SALARY|| 'and' || V_MAX_SALARY); RAISE_APPLICATION_ERROR (-20201, 'inveald update'); WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE( 'invalid_JOB_ID NO EMPLOYY ' ||V_JOB_ID); END ; / show errors جزاك الله ياخى طريقه محترفين ولكن هل الناتج مفروض يبقى كدهعند ادخال سعر عالى Invalid salary600000 Salaries for jobSA_REPmust be between6000and12000begin*ERROR at line 1:ORA-20201: inveald updateORA-06512: at "HR.CHECK_SALARY", line 27ORA-06512: at "HR.CHECK_SALARY_TRG", line 2ORA-04088: error during execution of trigger 'HR.CHECK_SALARY_TRG'ORA-06512: at "HR.ADD_EMPLOYEE", line 6ORA-06512: at line 2 تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.