issaka_adams بتاريخ: 6 يونيو 2006 تقديم بلاغ مشاركة بتاريخ: 6 يونيو 2006 انا كنت اشتغل على Stored procedure فى sqlserverوماشية معاى تمام التمام .........بس انا بدى اشتغل اوراكللقيت فى procedure فى الاوراكلب ما عرفت كيف اعمل جملة Select فى البروسيجريا ريت تساعدونى .... وبارك الله فى الجميع اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
nimo2000 بتاريخ: 7 يونيو 2006 تقديم بلاغ مشاركة بتاريخ: 7 يونيو 2006 الاخ العزيزتحية طيبة وبعداليك التالى فى كبفبة عمل الاجراء او البروسجر كالاجـــراء Procedure وحدة برمجية مكتوبة ب Pl-Sql يتم استدعاءها لتقوم بتنفيذ مهمة او عدة من المهام وهى كوحدة برمجية لا تحتاج الى ارجاع قيمة معينة0 يمكن تمثيلها بعامل البريد الذى يقوم بوضع خطاب فى صندوق البريد الخاص بك ففى هذه الحالة يؤدى المهمة وينصرف بسلام حيث لا يتعين عليه ان يعلمك حتى بوجود خطاب جديد فى صندوقك فليست مهمته ذلك 0 تكون الصيغة العامة كما يلى CREATE OR REPLACE PROCEDURE name [(parameter[, parameter, ...])]AS [local declarations]BEGIN executable statements[EXCEPTION exception handlers]END [name];كل اجراء مكون من قسمين :الراس Header وهو كل ما ياتى قبل الكلمة AS واحيانا تكون العبارة IS ويحتوى ذلك القسم على اسم الاجراء بالاضافة الى البارمتر او مجموعة البارمتر الخاصة به 0 الجسم نفسه وهو كل ما ياتى بعد الكلمة AS لاحظ ان الكلمة REPLACE وهى تأتى لكى نستطيع ان نعدل فى نفس الاجراء بدون الحاجة الى اسقاط الاجراء ذاته ثم اعادة بناءه وتخزينه من جديد فى قاعدة البيانات0CREATE OR REPLACE PROCEDURE DiscountAS CURSOR c_group_discount IS SELECT distinct s.course_no, c.description FROM section s, enrollment e, course c WHERE s.section_id = e.section_id AND c.course_no = s.course_no GROUP BY s.course_no, c.description, e.section_id, s.section_id HAVING COUNT(*) >=8;BEGIN FOR r_group_discount IN c_group_discount LOOP UPDATE course SET cost = cost * .95 WHERE course_no = r_group_discount.course_no; DBMS_OUTPUT.PUT_LINE ('A 5% discount has been given to'|| r_group_discount.course_no||' '|| r_group_discount.description ); END LOOP;END;ويمكن تنفيذ الاجراء عن طريق استدعاءه من خلال sqlplus بواسطة الامر EXECUTE وفى حالة تنفيذه فى الفورم يكتفى بكتابة اسم الاجراء EXECUTE Procedure_name SQL> EXECUTE Discount ; وللحصول على معلومات عن الاجراء المخزن فى قاعدة البيانات جرب التالىSELECT object_name, object_type, status FROM user_objects WHERE object_name = 'DISCOUNT';وللحصول على الكود الخاص بالاجراء يمكن اجراء جملة ال SQL التالية column text format a70 SELECT TO_CHAR(line, 99)||'>', text FROM user_source WHERE name = 'DISCOUNT' اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
nimo2000 بتاريخ: 7 يونيو 2006 تقديم بلاغ مشاركة بتاريخ: 7 يونيو 2006 الاخ العزيز اليك تكلمة الاجراء المخزن فى قاعدة البيانات مع ملاحظة ضرورة مراعاة اتجاه الكتابة database trigger يعد الزناد او التريجر من قبيل بلوكات لغة الاستعلام الاجرائية وهو بلوك ذو اسم معين ويخزن فى قاعدة البيانات ويتم تشغيله بصورة اتوماتكية ويسمى الحدث الذى يؤدى الى تشغيل التريجر اتوماتيكيا بضغط الزناد Firing the Trigger 0 ان الحدث الذى يؤدى الى تفعيل التريجر هو من القسم الخاص فى لغة ال SQL والذى يتعامل مع البيانات DML فهو قد يكون اما بادخال سجل جديد على التابل او تعديل فى السجل او ربما الغاءه 0 ان التريجر او الزناد اما ان يفعل قبل الحدث او بعد الحدث فمثلا قبل ادخال السجل الى التابل او بعد تعديل سجل فى التابل المعين0 تكون الصورة العامة لانشاء الزناد على النحو التالى : CREATE [ORREPLACE] TRIGGER trigger_name{BEFORE|AFTER} triggering_event ON table_name[FOR EACH ROW][WHEN condition]DECLARE Declaration statementsBEGIN Executable statementsEXCEPTION Exception-handling statementsEND; ان الكلمة Create والتى فى الصورة العامة تشير الى انشاء التريجر الجديد اما الامر Replace فهى تفيد التعديل فى التريجر اذا كان موجودا من قبل بينما تشير العبارة ON table_name الى اسم التابل المراد تفعييل التريجر عليه بينما تشير Before , After الى متى نريد تفعيل التريجر قبل ام بعد حدوث الحدث 0تشير العبارة For Each Row الى اننا نريد تفعيل التريجر مرة واحدة لكل سجل موجود فى التابل فعلى سبيل المثال يتم تفعيل التريجر لكل صف جديد يدخل على التابل 0 تشير العبارة When الى الشرط المراد تحققه ( True ) لكى يتم تفعيل التريجير والذى قد يكون كقيد على عمود معين المكون للتابل بينما الباقى يشير الى الجزء التنفيذى الذى سوف ينفذ فى بناء التريجر0 من الضرورى تذكر ان التريجر يكون مربوطا بتابل معين وبالتالى اذا تم الغاء التابل فان التريجر المربوط عليه سيتم الغاءه تلقائيا 01. تستعمل التريجر لعدد من الاغراض الهامة فقد يكون مطلوبا وضع شروط معقدة لا نستطيع ان نضعها بواسطة التحقق من اكتمال وسلامة البيانات التقليدية integrity constraints 2. وضع شروط معقدة للامان security rules 3. توليد قيم مشتقة من اعمدة فى التابل 4. توليد احصائيات عن تابل معينة 5. عمل طريقة اتوماتيكية لتعديل القيم ان جسم التريجر او الزناد هو بلوك PL-sql الا ان هناك امور ينبغى معرفتها وهى : 6. لا يمكن ان يولد التريجر جمل مثل COMMIT, SAVEPOINT, or ROLLBACK لان التريجر عندما يفعل يصبح هو نفسه خزءا من عملية وبالتالى عندما تؤكد تلك العملية او تلغى فان ما يقوم به التريجر يؤكد تبعا لذلك 0 7. اذا كان التيرجر يستعدى اجراء او دوال معينة فلا يصح ان تكون من ضمن مكوناتهما اية من الجمل السابقة – 8. لا يمكن ان يحتوى التريجر على متغيرات من النوع LONG or LONG RAW ومثال على تريجر قبل الادخال كما يلى : CREATE OR REPLACE TRIGGER student_biBEFORE INSERT ON studentFOR EACH ROWDECLARE v_student_id STUDENT.STUDENT_ID%TYPE;BEGIN SELECT STUDENT_ID_SEQ.NEXTVAL INTO v_student_id FROM dual; :NEW.student_id := v_student_id; :NEW.created_by := USER; :NEW.created_date := SYSDATE; :NEW.modified_by := USER; :NEW.modified_date := SYSDATE;END; نلاحظ ان الكلمة New وهى تشير الى الصف الحالى والذى سيتم التعامل معه 0 والمثال التالى يفعل بعد اجراء التعديل على التابل حيث يتسخدم فى توليد احصئايات معينة عن عمليات التعديل التى تمت على تابل معين 0ويضع تلك الاحصاءات فى تابل جديد 0 CREATE OR REPLACE TRIGGER instructor_audAFTER UPDATE OR DELETE ON INSTRUCTORDECLARE v_type VARCHAR2(10);BEGIN IF UPDATING THEN v_type := 'UPDATE'; ELSIF DELETING THEN v_type := 'DELETE'; END IF; UPDATE statistics SET transaction_user = USER, transaction_date = SYSDATE WHERE table_name = 'INSTRUCTOR' AND transaction_name = v_type; IF SQL%NOTFOUND THEN INSERT INTO statistics VALUES ('INSTRUCTOR', v_type, USER, SYSDATE); END IF;END; ان الحقل الوهمى المعبر عنه ب ( :NEW. :OLD ) يشير الى الصف الحالى المراد تعديله حيث تعبر new عن البيانات الجديدة بينما تعبر old على القيم قبل التعديل فعلى سبيل المثال انظر الى جملة التعديل التالية UPDATE student SET zip = '01247' WHERE zip = '02189'; تكون :new.zipcode هى ('01247' ) بينما القيمة قبل التعديل :old.zipcode هى '02189' راجع التريجر التالى والذى يحدد الشرط الذى بتحققه سيتم تفعيل التريجر CREATE TRIGGER student_auAFTER UPDATE ON STUDENTFOR EACH ROWWHEN (NVL(NEW.ZIP, ' ') <> OLD.ZIP) Trigger Body… تقوم When بالمقارنة بين القيمة الجديدة من الحقل Zipcode بالقيمة القديمة فاذا لم تتغيرا فان ذلك يولد False وبالتالى فان التريجر لن يعمل 0 فلا حالة التريجير على مستوى الصف فان التريجير يتم تفعليه العديد من المرات طالما انه توجد صفوف فى التابل يمكن ان تتأثر بالتريجر المعرف فعلى سبيل المثال اذا كان هناك 20 صف فى التابل والخاضعين للتعديل فان التريجر فى ذلك الحال سوف يتم تفعيله 20 مرة كما فى الكود التالىFOR EXAMPLE CREATE OR REPLACE TRIGGER course_auAFTER UPDATE ON COURSEFOR EACH ROW... التريجر على مستوى الجملة فهو يفعل مرة واحدة فقط بصرف النظر عن عدد الصفوف المحتملة والتى من الممكن ان تتأثر بالتريجر المفعل ولعمل مثل ذلك النوع لا تكتب عبارة FOR EACH ROW فعلى سبيل المثال الذى يقيد ادخال صفوف جديدة او التعديل او الالغاء فى ايام العطلة الاسبوعيةFOR EXAMPLE CREATE OR REPLACE TRIGGER instructor_biudBEFORE INSERT OR UPDATE OR DELETE ON INSTRUCTORDECLARE v_day VARCHAR2(10);BEGIN v_day := RTRIM(TO_CHAR(SYSDATE, 'DAY')); IF v_day LIKE ('S%') THEN RAISE_APPLICATION_ERROR (-20000, 'A table cannot be '|| 'modified during off hours'); END IF;END; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.