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

ما هو الفرق بين Procedure وfunction

مغلق
بدأه aboslah4u22 في 11 ديسمبر 2007 · 3 رد · 16,775 مشاهدة · في قسم لغةالاجرائات Pl/sql
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاتة

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

واشكر المشرفين القائمين على هذا المنتدى .. الفريق العربى للبرمجة

اما بخصوص موضوعى فانا مبتدأ فى الاوراكل واريد توضيح منكم الفرق بين كل من

function, procedure,cursor,packedg

وعمل كل واحد منهم :rolleyes:

ولو امكن التوضيح بمثال B)

جزاكم الله كل خير

#2

السلام عليكم ورحمة الله وبركاته

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

اولا :

الاجـــراء 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'

--------------------------------------------------

ثانيا :

Function

تعد الدوال Function نوعا من انواع الكود القابل للتخزين فى قاعدة البيانات فهى وحدة برمجية مكتوبة ب Pl-Sql يتم استدعاءها لتقوم بتنفيذ مهمة او عدة من المهام وهى كوحدة برمجية تماثل الاجراءات الا ان الدوال تختلف فى انها لابد وان ترجع قيمة واحدة للجهة التى طلبتها حيث يمكن ان نمثلها بخدمة دليل التليفونات حيث تتصل فيرد عليك عامل التليفون فتسأله عن رقم معين او عنوان فيقوم بالبحث عنه ثم يرجع لك الرقم او العنوان المطلوب 0 ان الداول من الممكن ان تقبل واحدا او اكثر من البارمتر او من اللمكن عدم وجود اية بارمتر ولكن يلزم كما قلنا ارجعاها لقيمة واحدة وبالتالى لابد لها من وجود عبارة Return فى الجزء التنفيذى من البلوك الخاص بها كما ينبغى وان يتحدد نوع تلك القيمة فى جزء الرأس من نفس البلوك 0 تختلف الدوال ايضا عن الاجراءات فى مخرجات الدالة او القيمة التى سيتم ارجاعها لابد وان تخصص لمتغير كما ان الداول يمكن استخدامها فى جملة Select واليك الصور العامة لها مع مثال كما يلى :

Function Syntax

The syntax for creating a function is as follows:

CREATE [OR REPLACE] FUNCTION function_name

(parameter list)

RETURN datatype

IS

BEGIN

<body>

RETURN (return_value);

END;

CREATE OR REPLACE FUNCTION show_description

(i_course_no course.course_no%TYPE)

RETURN varchar2

AS

v_description varchar2(50);

BEGIN

SELECT description

INTO v_description

FROM course

WHERE course_no = i_course_no;

RETURN v_description;

EXCEPTION

WHEN NO_DATA_FOUND

THEN

RETURN('The Course is not in the database');

WHEN OTHERS

THEN

RETURN('Error in running show_description');

END;

ويتم استدعاء الدالة السابقة كما يلى

SET SERVEROUTPUT ON

DECLARE

v_description VARCHAR2(50);

BEGIN

v_description := show_description(&sv_cnumber);

DBMS_OUTPUT.PUT_LINE(v_description);

END;

يمكن تشغيل الدوال من خلال جمل SQL كما فى المثال التالى

SELECT course_no, show_description(course_no)

FROM course;

-------------------------------------------------------------------------------

Cursor المؤشر

لكى تقوم ارواكل بتنفيذ جملة SQL فانها تحتاج لانشاء منطقة خاصة فى الذاكرة والتى ستحوى جميع المعلومات اللازمة بتنفيذ الجملة ومن امثلة تلك معلومات احصائية عن عدد الصفوف من التابل التى سيتم استدعاءها نتيجة لتفيذ جملة الاستعلام - معلومات التهيئة والتحقق من سلامة الجملة من ناحية قواعد لغة الاستعلام parsing فضلا عن الصفوف الناتجة عن الاستعلام 0 ان الكرسور هو مؤشر او اداة للتعامل مع تلك المنطقة فى الذاكرة فهو يتحكم فيها وه يتيح لنا ايضا التحكم والتعامل مع الصفوف الناتجة عن جملة الاستعلام صفا صفا 0

يوجد نوعين من الكيرسور وهما :

1. الكيرسور المتضمن implicit cursor وهو كيرسور يتم انشاءة بصورة اتوماتيكية فى حالة تنفبذ اى جملة من جمل SQL مثل Update – Delete – Insert طالما انه لا يوجد كيرسور صريح وهذا يعنى ان المستخدم لن يتعين عليه ان يشغل باله بكيفية فتحه او اغلاقه وهو بالتالى فلا توجد اية تحكم او سيطرة على ذلك النوع 0

2. الكيرسور الصريح وهو الكيرسور الذى يقوم بتعريفه المبرمج داخل بلوك لغة SQL مما يتيح له التحكم ومعالجة الصفوف الناتجة عن جملة استعلام مثلا صفا صفا 0لعمل كيرسور صريح يتعين التالى

1. تعريف الكيرسور Declaring Cursor وهو تهية المؤشر بحجز منطقة محددة له فى الذاكرة

2. فتح الكيرسور السابق تعريفه وفى هذه الحالة تخصص منطقة الذاكرة وتتعين وتصبح جاهزة تماما للتعامل معها 0

3. استحضار الكيرسور Fetching the cursor حيث يصبح الكيرسور المعرف والمفتوح سابقا جاهزا لاستقبال بيانات جملة الاستعلام

4. غلق الكيرسور وتحرير مساحة الذاكرة التى كان يشغلها

المثال التالى يوضح تلك المراحل السابقة

SET SERVEROUTPUT ON

DECLARE

CURSOR c_zip IS

SELECT *

FROM zipcode;

vr_zip c_zip%ROWTYPE;

BEGIN

OPEN c_zip;

LOOP

FETCH c_zip INTO vr_zip;

EXIT WHEN c_zip%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(vr_zip.zip||

' '||vr_zip.city||' '||vr_zip.state);

END LOOP;

END;

--------------------------------------

أرجو ان اكون قد وضحت ووفقت وماتوفيقى الا بالله

كما ارجو لكم بالدعاء لى وللأمه الاسلاميه بالصلاح والهدى

وأى استفسار الرجاء مراسلتى وانا فى الخدمة

eng.sameh elmasry

#3

السلام عليكم ورحمة الله وركاتة

اشكرك جزيل الشكر eng.sameh elmasry على هذا الشرح الجميل

بارك الله فيك وفى امثالك

#4

لا شكر على واجب وارجو ان تكون انتفعت به وان ينتفع به غيرك من اخواننا المسلمين واى طلب تانى انا فى الخدمه

والله الموفق

----------------------------------------------------------------------------------

eng.sameh elmasry

هذا الموضوع مغلق.

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