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

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

صورة
- - - - -

مشكله بسيطه اوىىىى فى Trigger


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

#1 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 03 January 2010 - 03:03 AM

السلام على من اتبع الهدى
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 شغال ومفيش مشكله وبيطلع الارسائل بس حتى لو فى مشكله فى السعر يطلع الرسائل ويسجل بردك السعر الجديد انا عايزو يلغى
ادخال او تعديل السعر لو مش مظبوط وبطلع الرساله

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة


#2 عبدالله ندا

عبدالله ندا

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,017 مشاركة
  • الاسم الأول:عبدالله
  • اسم العائلة:ندا
  • البـلـد: Country Flag
  • المنصب الحالي:Technical Applications Manager

تاريخ المشاركة 03 January 2010 - 10:56 AM

استخدم
Raise_Application_Error(-20100,'');

ده هيعمل اكسبشن و يوقف الكوميت علي الداتا بيز وبالتالي العمليه كلها هيتعمل رول باك عليها وممكن تحط الرساله الي عاوزها بين الكوت وبتظهر علي مستوي الابلكيشن

تحياتي

في زمننا هذا .........................
ليس هناك قلب ناصع البياض ...
ولا قلب قاتم السواد ...
ولكن دائما
BLACK&WHITE

 

مع تحياتي
عبدالله ندا

http://anada.4shared.com

abdallahnada@hotmail.com 


#3 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 04 January 2010 - 04:51 AM

اخى الفاضل نا حاولت استخدام اليرور بتاعك ومعملش حاجه
كتابته بهذه الطريقه
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 عبدالله ندا

عبدالله ندا

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,017 مشاركة
  • الاسم الأول:عبدالله
  • اسم العائلة:ندا
  • البـلـد: Country Flag
  • المنصب الحالي:Technical Applications Manager

تاريخ المشاركة 04 January 2010 - 09:07 AM

استخدمته فين مش شايف الكود الي كتبته اكتبه تحت ال دي بي ام اس علي طول بنفس السينتكس الي كاتبتها انا

في زمننا هذا .........................
ليس هناك قلب ناصع البياض ...
ولا قلب قاتم السواد ...
ولكن دائما
BLACK&WHITE

 

مع تحياتي
عبدالله ندا

http://anada.4shared.com

abdallahnada@hotmail.com 


#5 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 04 January 2010 - 04:28 PM

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 between6000and12000

begin
*

ERROR at line 1:
ORA-20201: inveald update
ORA-06512: at "HR.CHECK_SALARY", line 27
ORA-06512: at "HR.CHECK_SALARY_TRG", line 2
ORA-04088: error during execution of trigger 'HR.CHECK_SALARY_TRG'
ORA-06512: at "HR.ADD_EMPLOYEE", line 6
ORA-06512: at line 2

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة