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

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

صورة
- - - - -

Stored Procedure فى الاوراكل


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

#1 issaka_adams

issaka_adams

    عضو

  • الأعضــاء
  • 5 مشاركة

تاريخ المشاركة 06 June 2006 - 11:14 PM

انا كنت اشتغل على Stored procedure فى sqlserver
وماشية معاى تمام التمام .........بس انا بدى اشتغل اوراكل
لقيت فى procedure فى الاوراكل
ب ما عرفت كيف اعمل جملة Select فى البروسيجر
يا ريت تساعدونى .... وبارك الله فى الجميع :D

#2 nimo2000

nimo2000

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

  • المجموعة الماسية
  • 343 مشاركة

تاريخ المشاركة 07 June 2006 - 09:28 AM

الاخ العزيز
تحية طيبة وبعد
اليك التالى فى كبفبة عمل الاجراء او البروسجر ك

الاجـــراء 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 وهى تأتى لكى نستطيع ان نعدل فى نفس الاجراء بدون الحاجة الى اسقاط الاجراء ذاته ثم اعادة بناءه وتخزينه من جديد فى قاعدة البيانات0
CREATE OR REPLACE PROCEDURE Discount
AS
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'
وفقنا الله جميعا لتعلم العلم النافع ونشره والعمل بـــه

ارحب باستقبال رسائلكم على البريد الالكترونى
Nimo20012001@yahoo.com
---------------------------------------------------------------------------------------------------

#3 nimo2000

nimo2000

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

  • المجموعة الماسية
  • 343 مشاركة

تاريخ المشاركة 07 June 2006 - 09:32 AM

الاخ العزيز
اليك تكلمة الاجراء المخزن فى قاعدة البيانات
مع ملاحظة ضرورة مراعاة اتجاه الكتابة

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 statements
BEGIN
Executable statements
EXCEPTION
Exception-handling statements
END;


ان الكلمة Create والتى فى الصورة العامة تشير الى انشاء التريجر الجديد اما الامر Replace فهى تفيد التعديل فى التريجر اذا كان موجودا من قبل بينما تشير العبارة ON table_name الى اسم التابل المراد تفعييل التريجر عليه بينما تشير Before , After الى متى نريد تفعيل التريجر قبل ام بعد حدوث الحدث 0
تشير العبارة For Each Row الى اننا نريد تفعيل التريجر مرة واحدة لكل سجل موجود فى التابل فعلى سبيل المثال يتم تفعيل التريجر لكل صف جديد يدخل على التابل 0 تشير العبارة When الى الشرط المراد تحققه ( True ) لكى يتم تفعيل التريجير والذى قد يكون كقيد على عمود معين المكون للتابل بينما الباقى يشير الى الجزء التنفيذى الذى سوف ينفذ فى بناء التريجر0 من الضرورى تذكر ان التريجر يكون مربوطا بتابل معين وبالتالى اذا تم الغاء التابل فان التريجر المربوط عليه سيتم الغاءه تلقائيا 0
1. تستعمل التريجر لعدد من الاغراض الهامة فقد يكون مطلوبا وضع شروط معقدة لا نستطيع ان نضعها بواسطة التحقق من اكتمال وسلامة البيانات التقليدية 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_bi
BEFORE INSERT ON student
FOR EACH ROW
DECLARE
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_aud

AFTER UPDATE OR DELETE ON INSTRUCTOR

DECLARE

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_au
AFTER UPDATE ON STUDENT
FOR EACH ROW
WHEN (NVL(NEW.ZIP, ' ') <> OLD.ZIP)
Trigger Body…




تقوم When بالمقارنة بين القيمة الجديدة من الحقل Zipcode بالقيمة القديمة فاذا لم تتغيرا فان ذلك يولد False وبالتالى فان التريجر لن يعمل 0







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

FOR EXAMPLE


CREATE OR REPLACE TRIGGER course_au
AFTER UPDATE ON COURSE
FOR EACH ROW
...


التريجر على مستوى الجملة فهو يفعل مرة واحدة فقط بصرف النظر عن عدد الصفوف المحتملة والتى من الممكن ان تتأثر بالتريجر المفعل ولعمل مثل ذلك النوع لا تكتب عبارة FOR EACH ROW فعلى سبيل المثال الذى يقيد ادخال صفوف جديدة او التعديل او الالغاء فى ايام العطلة الاسبوعية

FOR EXAMPLE







CREATE OR REPLACE TRIGGER instructor_biud
BEFORE INSERT OR UPDATE OR DELETE ON INSTRUCTOR
DECLARE
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;
وفقنا الله جميعا لتعلم العلم النافع ونشره والعمل بـــه

ارحب باستقبال رسائلكم على البريد الالكترونى
Nimo20012001@yahoo.com
---------------------------------------------------------------------------------------------------