الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعدة في استدعاء اجراء داخل Trigger

بدأه نون1 في 2 أبريل 2009 · 1 رد · 1,352 مشاهدة · في قسم لغةالاجرائات Pl/sql
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

انا عضو جديد سمعت كثير عن هذا المنتدى من مديح وشكر وموسوعة علمية في مجال البرمجة بأنواعها

وهو تجمع لكل المبرمجين المحترفين والذي اطمح واتمنى ان اكون واحداً منهم

فأتمنا ان تقبلوني معكم فأنا خبرتي متواضعة في مجال قواعد البيانات

عندي سؤال حيرني لم اقدر التوصل اليه وهو عن التريقر

عندما استدعي PACKAGE داخل التريقر وادخل هذا الباكج

ثلاثة اجراءات الاول حلقة دوران تأخذ كل طالب ثم يستدعي الثاني الذي يقوم بإجتساب المعدل فصلي والثاني يستدعي الثالث الذ يقوم بإحتساب المعدل التركمي للطالب وتعديل الجدول لإضافة المعدلات فيه

المشكلة

ان التريقر لا يقوم بالتعديل عندما اغير درجة للطالب في الجدول كأنه لم يرى هذه الاجراءات او لم يفهم انه يوجد اجراء داخل اجراء .والمفروض عند التعديل مباشرة في درجة للطالب يعيد احتساب المعدل مرة ثانية وتعديل الجدول

وهذا كود الباكج وفيه الاجراءات

المهم فيه هو كود التعديل لجدول term update

CREATE OR REPLACE PACKAGE BODY URS_CALC_AVG IS

-- Private type declarations

-- Private constant declarations

-- Private variable declarations

-- Function and procedure implementations

/*************************************************************************/

PROCEDURE Calc_avg (

P_STUD_ID NUMBER,

P_TERM_YYT NUMBER,

P_COLG_NO NUMBER,

P_SPEC_NO NUMBER,

P_TEACH_TYPE VARCHAR2

) IS

CURSOR ST IS

SELECT INFO.STUD_ID

FROM URS_STUD_INFO INFO,

URS_STUD_SPECS SPECS,

URS_STUD_STATUS STATUS

where INFO.STUD_ID = DECODE(P_STUD_ID,0,INFO.STUD_ID,P_STUD_ID)

AND INFO.COLG_NO = DECODE(P_COLG_NO,0,INFO.COLG_NO,P_COLG_NO)

AND SPECS.SPEC_NO = DECODE(P_SPEC_NO,0,SPECS.SPEC_NO,P_SPEC_NO)

AND SPECS.TEACH_TYPE = DECODE(P_TEACH_TYPE,0,SPECS.TEACH_TYPE,P_TEACH_TYPE)

AND SPECS.STUD_ID=INFO.STUD_ID

AND INFO.STUD_STATUS=STATUS.STUD_STATUS

AND INCLUDE_AVG=1

ORDER BY INFO.COLG_NO,SPECS.SPEC_NO,INFO.STUD_ID;

CURSOR YYT (STUDENT NUMBER) IS

SELECT TERM_YYT FROM URS_TERM

WHERE STUD_ID=STUDENT

AND TERM_YYT <= P_TERM_YYT

ORDER BY TERM_YYT;

B NUMBER(1) :=0;

BEGIN

FOR ST_REC IN ST LOOP

FOR YYT_REC IN YYT (ST_REC.STUD_ID) LOOP

B:=1;

URS_CALC_AVG.TERM_AVG (ST_REC.STUD_ID,YYT_REC.TERM_YYT);

END LOOP;

END LOOP;

--COMMIT;

END CALC_AVG;

/*************************************************************************/

PROCEDURE TERM_AVG (

P_STUD_ID NUMBER,

P_TERM_YYT NUMBER

) IS

TERM_AVERAGE NUMBER;

TERM_AVG_POINT NUMBER;

SPEC NUMBER;

BEGIN

-- 1> Calculate term average.

SELECT NVL(SUM( NVL(SR_MARK, 0) * C.CRS_CR_HOURS ) /

SUM( C.CRS_CR_HOURS ),0) INTO TERM_AVERAGE

FROM URS_STUD_REG R,URS_COURSE C,URS_REG_STATUS STATUS

WHERE STUD_ID = P_STUD_ID

AND CLASS_YYT = P_TERM_YYT

AND R.CRS_NO = C.CRS_NO

AND R.CRS_SEQ = C.CRS_SEQ

AND R.REG_STATUS=STATUS.REG_STATUS

AND INCLUDE_AVG=1;

-- 2> UPDATE TERM table.

SELECT SPEC_NO

INTO SPEC

FROM URS_STUD_SPECS

WHERE STUD_ID=P_STUD_ID;

/* BEGIN

SELECT GL_POINT

INTO TERM_AVG_POINT

FROM URS_SPEC_GRADE_LEVEL

WHERE ROUND(TERM_AVERAGE,2) BETWEEN GL_MIN_MARK AND GL_MAX_MARK

AND GL_SPEC_NO=SPEC;

EXCEPTION WHEN NO_DATA_FOUND THEN*/

BEGIN

SELECT GL_POINT

INTO TERM_AVG_POINT

FROM URS_GRADE_LEVEL

WHERE ROUND(TERM_AVERAGE,2) BETWEEN GL_MIN_MARK AND GL_MAX_MARK;

EXCEPTION WHEN NO_DATA_FOUND THEN

raise_application_error( -20001,'ÊÃßÏ ãä æÌæÏ ÈíÇäÇÊ Ýí äÙÇã ÇáÊÞÏíÑÇÊ' );

END;

-- END;

UPDATE URS_TERM

SET TERM_AVG = NVL(TERM_AVG_POINT,0),

TERM_AVG_DEGREE=ROUND(NVL(TERM_AVERAGE,0),2),

TERM_MARK_STATUS = '1',

TIME_STAMP = SYSDATE

WHERE STUD_ID = P_STUD_ID

AND TERM_YYT = P_TERM_YYT;

-- 3> Call accumlated average.

URS_CALC_AVG.TERM_ACUM_AVG ( P_STUD_ID , P_TERM_YYT);

-- COMMIT;

EXCEPTION

WHEN NO_DATA_FOUND THEN

raise_application_error( -20001,'ÊÃßÏ ãä æÌæÏ ÈíÇäÇÊ Ýí äÙÇã ÇáÊÞÏíÑÇÊ' );

WHEN TOO_MANY_ROWS THEN

raise_application_error( -20001,'åäÇß ÊßÑÇÑ Ýí ÈíÇäÇÊ äÙÇã ÇáÊÞÏíÑÇÊ' );

END TERM_AVG;

/*************************************************************************/

PROCEDURE TERM_ACUM_avg (

P_STUD_ID NUMBER,

P_TERM_YYT NUMBER

) IS

ALL_HOURS NUMBER;

ALL_POINTS NUMBER;

ACUM_AVG NUMBER;

ACUM_DEGREE NUMBER;

SPEC NUMBER;

BEGIN

SELECT NVL(SUM(NVL(SR_MARK,0)*C.CRS_CR_HOURS),0), NVL(SUM(C.CRS_CR_HOURS),0)

INTO ALL_POINTS,ALL_HOURS

FROM URS_STUD_REG R,URS_COURSE C,URS_REG_STATUS STATUS

WHERE CLASS_YYT <= P_TERM_YYT

AND STUD_ID = P_STUD_ID

AND R.REG_STATUS=STATUS.REG_STATUS

AND INCLUDE_AVG=1

AND R.CRS_NO = C.CRS_NO

AND R.CRS_SEQ = C.CRS_SEQ

AND CLASS_YYT =(SELECT MAX(CLASS_YYT) FROM URS_STUD_REG

WHERE STUD_ID = R.STUD_ID

AND CRS_NO = R.CRS_NO

AND CRS_SEQ = R.CRS_SEQ

AND CLASS_YYT<=P_TERM_YYT)

AND CRS_INCLUDE!=0;

IF NVL(ALL_HOURS,0) = 0 THEN

ACUM_AVG := 0;

ACUM_DEGREE:=0;

ELSE

ACUM_DEGREE := ROUND(ALL_POINTS / ALL_HOURS,2);

SELECT SPEC_NO

INTO SPEC

FROM URS_STUD_SPECS

WHERE STUD_ID=P_STUD_ID;

BEGIN

SELECT GL_POINT

INTO ACUM_AVG

FROM URS_GRADE_LEVEL

WHERE ACUM_degree BETWEEN GL_MIN_MARK AND GL_MAX_MARK;

EXCEPTION WHEN NO_DATA_FOUND THEN

raise_application_error( -20001,'ÊÃßÏ ãä æÌæÏ ÈíÇäÇÊ Ýí äÙÇã ÇáÊÞÏíÑÇÊ' );

END;

-- END;

END IF;

UPDATE URS_TERM

SET TERM_ACUM_AVG = ACUM_AVG,

TERM_ACUM_DEGREE = ACUM_DEGREE

WHERE STUD_ID=P_STUD_ID

AND TERM_YYT=P_TERM_YYT;

-- COMMIT;

EXCEPTION

WHEN NO_DATA_FOUND THEN

raise_application_error( -20001,'ÊÃßÏ ãä æÌæÏ ÈíÇäÇÊ Ýí äÙÇã ÇáÊÞÏíÑÇÊ' );

WHEN TOO_MANY_ROWS THEN

raise_application_error( -20001,'åäÇß ÊßÑÇÑ Ýí ÈíÇäÇÊ äÙÇã ÇáÊÞÏíÑÇÊ' );

WHEN others THEN

raise_application_error( -20001,'åäÇß ÎØÃ ÑÇÌÚ ãÓÆæá ÇáäÙÇã' );

END TERM_ACUM_AVG;

-- Initialization

/*************************************************************************/

end URS_CALC_AVG;

/

وهذا الترايقر

CREATE OR REPLACE TRIGGER EDUWARE.REG_TRANSACTION

BEFORE DELETE OR UPDATE

ON EDUWARE.URS_STUD_REG

REFERENCING NEW AS NEW OLD AS OLD

FOR EACH ROW

declare

spec number(5);

colg number(5);

teach varchar2(5);

BEGIN

select spec_no,colg_no,teach_type into spec,colg,teach--,stud

from urs_stud_info i,urs_stud_specs s

where i.stud_id=s.stud_id

and i.stud_id=:OLD.stud_ID;

IF UPDATING THEN

urs_calc_avg.calc_avg (:old.stud_ID ,:old.class_yyt ,COLG,SPEC,TEACH) ;

-- ELSIF DELETING THEN

urs_calc_avg.calc_avg (:old.stud_ID ,:old.class_yyt ,COLG,SPEC,TEACH) ;

END IF;

END;

طويل لكنه سهل

لا اعرف هل سيكون مفهوم

تم تعديل هذه المشاركة بواسطة نون1 في 2 أبريل 2009 في 11:48

#2

أخي الكود كبير جدا حتى يتم متابعته

ارجو ان تعمل مثال اخر على hr مثلا صغير حتى يمكن متابعتة

واعتقد ان المشكلة تكون عندما يتم عمل Select من نفس الجدول الذي علية التريجر

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…