Oracle إجراءات ووظائف PL/SQL المخزنة مع أمثلة

⚡ ملخص ذكي

تُسمى البرامج الفرعية في لغة PL/SQL بالكتل والإجراءات والدوال، وتُخزن في قاعدة البيانات ويتم استدعاؤها بالاسم. يُشغّل الإجراء عمليةً ما، بينما تُعيد الدالة قيمةً، ويتبادل كلاهما البيانات من خلال مُعاملات الإدخال والإخراج والإخراج والكلمة المفتاحية RETURN.

  • 🧩 برنامجان فرعيان: تقوم الإجراءات بتنفيذ عملية ما؛ أما الدوال فتقوم بإجراء عملية حسابية وإرجاع قيمة.
  • ؟؟؟؟ المعلمات: يقوم المدخل IN بتمرير المدخلات، ويقوم المخرج OUT بإرجاع المخرجات، ويقوم المدخل IN OUT بكليهما.
  • ↩️ إرجاع: يعيد التحكم إلى المستدعي؛ وفي الدالة، يعيد أيضًا قيمة من نوع مُعلن.
  • 🗄️ الكائنات المخزنة: يتم حفظ كليهما ككائنات قاعدة بيانات ويمكن استدعاؤهما من كتل أخرى.
  • 🔎 اختر الاستخدام: يمكن استدعاء دالة بدون لغة معالجة البيانات (DML) داخل عبارة SELECT؛ أما الإجراء فلا يمكن استدعاؤه.
  • 🇧🇷 الفرق الرئيسي: يجب أن تُرجع الدالة قيمة، بينما لا يلزم ذلك بالنسبة للإجراء.
  • 🛠️ وظائف مدمجة: Oracle وظائف تحويل السفن، والسلاسل النصية، والتواريخ جاهزة للاستخدام.

Oracle الإجراءات والوظائف المخزنة في لغة PL/SQL

ما هي البرامج الفرعية في لغة PL/SQL؟

في هذا البرنامج التعليمي، سترى وصفًا تفصيليًا لكيفية إنشاء وتنفيذ الكتل والإجراءات والوظائف المسماة.

الإجراءات والوظائف هي برامج فرعية يمكن إنشاؤها وحفظها في قاعدة البيانات ككائنات قاعدة بيانات. ويمكن استدعاؤها أو الإشارة إليها داخل كتل أخرى أيضًا.

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

المصطلحات في البرامج الفرعية PL/SQL

قبل التعرف على البرامج الفرعية PL/SQL، سنناقش المصطلحات المختلفة التي تشكل جزءًا من هذه البرامج الفرعية.

معامل

المعامل هو متغير أو عنصر نائب لأي قيمة صالحة نوع بيانات PL/SQL من خلال هذه الخاصية، يتبادل البرنامج الفرعي PL/SQL القيم مع الكود الرئيسي. تسمح هذه الخاصية بإدخال البيانات إلى البرامج الفرعية و...tracاستخلاص القيم منها.

  • وينبغي تعريف هذه المعلمات مع البرامج الفرعية في وقت الإنشاء.
  • يتم تضمينها في عبارة الاستدعاء للتفاعل مع البرامج الفرعية.
  • يجب أن يكون نوع بيانات المعامل في البرنامج الفرعي هو نفسه نوع بيانات عبارة الاستدعاء.
  • لا ينبغي ذكر حجم نوع البيانات في وقت تعريف المعلمة، لأن الحجم ديناميكي.

تُصنف المعايير بناءً على غرضها على النحو التالي:

  1. في المعلمة
  2. المعلمة خارج
  3. في خارج المعلمة

في المعلمة

  • تُستخدم لإدخال البيانات إلى البرامج الفرعية.
  • هو متغير للقراءة فقط داخل البرامج الفرعية؛ لا يمكن تغيير قيمته داخل البرنامج الفرعي.
  • في عبارة الاستدعاء، يمكن أن يكون متغيرًا أو قيمة حرفية أو تعبيرًا، مثل '5*8' أو 'a/b'.
  • بشكل افتراضي، تكون المعلمات من نوع الإدخال (IN).

المعلمة خارج

  • تُستخدم للحصول على مخرجات من البرامج الفرعية.
  • هو متغير للقراءة والكتابة داخل البرامج الفرعية؛ ويمكن تغيير قيمته داخلها.
  • في عبارة الاستدعاء، يجب أن يكون دائمًا متغيرًا لحفظ القيمة من البرنامج الفرعي.

في خارج المعلمة

  • تُستخدم هذه الأداة لإدخال البيانات واستقبال المخرجات من البرامج الفرعية.
  • هو متغير للقراءة والكتابة داخل البرامج الفرعية؛ ويمكن تغيير قيمته داخلها.
  • في عبارة الاستدعاء، يجب أن يكون دائمًا متغيرًا لحفظ القيمة من البرنامج الفرعي.

يجب ذكر نوع المعلمة عند إنشاء البرامج الفرعية.

عودة

الكلمة المفتاحية RETURN هي التي تُوجه المُترجم لنقل التحكم من البرنامج الفرعي إلى عبارة الاستدعاء. في البرنامج الفرعي، تعني RETURN ببساطة أن التحكم يجب أن يخرج من البرنامج الفرعي؛ بمجرد أن يجد المُتحكم RETURN، يتم تخطي الكود الذي يليه.

عادةً، يستدعي الجزء الرئيسي من البرنامج البرامج الفرعية، وينتقل التحكم من الجزء الرئيسي إلى البرنامج الفرعي المُستدعى. تُعيد عبارة RETURN في البرنامج الفرعي التحكم إلى الجزء الرئيسي. في حالة الدوال، تُعيد عبارة RETURN قيمةً أيضًا، ويُحدد نوع بياناتها عند تعريف الدالة.

ما هو الإجراء في لغة PL/SQL؟

A العملية في لغة PL/SQL، تُعدّ وحدة البرنامج الفرعي عبارة عن مجموعة من عبارات PL/SQL التي يمكن استدعاؤها بالاسم. لكل إجراء اسم فريد خاص به ويتم تخزينه في Oracle قاعدة البيانات ككائن قاعدة بيانات.

ملاحظة: البرنامج الفرعي ليس إلا إجراءً، ويجب إنشاؤه يدويًا حسب الحاجة. وبمجرد إنشائه، يُخزَّن ككائن في قاعدة البيانات.

خصائص وحدة البرنامج الفرعي الإجرائي في لغة PL/SQL هي:

  • الإجراءات عبارة عن وحدات مستقلة يمكن تخزينها في قاعدة بيانات.
  • يمكن استدعاؤها بأسمائها لتنفيذ عبارات PL/SQL.
  • تُستخدم بشكل أساسي لتنفيذ عملية ما.
  • يمكن أن تحتوي على كتل متداخلة، أو أن تكون متداخلة داخل كتل أو حزم أخرى.
  • تحتوي على جزء إعلان (اختياري)، وجزء تنفيذ، وجزء معالجة الاستثناءات (اختياري).
  • يمكن تمرير القيم إلى إجراء أو جلبها منه من خلال المعلمات.
  • يجب تضمين هذه المعلمات في بيان الاستدعاء.
  • يمكن أن يحتوي الإجراء على عبارة RETURN لإعادة التحكم إلى كتلة الاستدعاء، لكن لا يمكنه إرجاع أي قيمة من خلال RETURN.
  • لا يمكن استدعاء الإجراءات مباشرة من عبارات SELECT؛ يمكن استدعاؤها من كتلة أخرى أو من خلال الكلمة المفتاحية EXEC.

بناء الجملة

CREATE OR REPLACE PROCEDURE
<procedure_name>
(
<parameter1 IN/OUT <datatype>
..
.
)
[ IS | AS ]
<declaration_part>
BEGIN
<execution part>
EXCEPTION
<exception handling part>
END;
  • يُوجّه الأمر CREATE PROCEDURE المُصرّف لإنشاء إجراء جديد. وتُوجّه الكلمة المفتاحية 'OR REPLACE' المُصرّف لاستبدال الإجراء الحالي (إن وُجد) بالإجراء الحالي.
  • يجب أن يكون اسم الإجراء فريدًا.
  • تُستخدم الكلمة المفتاحية 'IS' عندما يكون الإجراء المخزن مضمنًا داخل كتلة أخرى. أما إذا كان الإجراء مستقلًا، فتُستخدم الكلمة المفتاحية 'AS'. وبغض النظر عن هذا المعيار البرمجي، فإن لكليهما نفس المعنى.

مثال 1: إنشاء إجراء واستدعائه باستخدام EXEC. في هذا المثال، نقوم بإنشاء Oracle إجراء يأخذ اسمًا كمدخل ويطبع رسالة ترحيب كمخرج، باستخدام أمر EXEC لاستدعائه.

CREATE OR REPLACE PROCEDURE welcome_msg (p_name IN VARCHAR2)
IS
BEGIN
dbms_output.put_line ('Welcome '|| p_name);
END;
/
EXEC welcome_msg ('Guru99');

Code التفسير:

  • Code السطر 1: إنشاء الإجراء بالاسم 'welcome_msg' ومعامل واحد 'p_name' من النوع 'IN'.
  • Code السطر 4: طباعة رسالة الترحيب عن طريق دمج اسم الإدخال.
  • تم تجميع الإجراء بنجاح.
  • Code السطر 7: استدعاء الإجراء باستخدام EXEC مع المعلمة 'Guru99'. يتم تنفيذ الإجراء وطباعة "مرحباً" Guru99 ".

ما هي الوظيفة؟

الدالة هي برنامج فرعي مستقل في لغة PL/SQL. ومثل الإجراء، تحمل الدالة اسمًا فريدًا وتُخزَّن ككائن في قاعدة بيانات PL/SQL. ومن خصائصها:

  • الدوال عبارة عن وحدات مستقلة تُستخدم بشكل أساسي لإجراء العمليات الحسابية.
  • تستخدم الدالة الكلمة المفتاحية RETURN لإرجاع قيمة، يتم تحديد نوع بياناتها في وقت الإنشاء.
  • يجب على الدالة إما إرجاع قيمة أو إثارة استثناء؛ الإرجاع إلزامي في الدوال.
  • يمكن استدعاء دالة بدون عبارات DML مباشرة في استعلام SELECT، بينما لا يمكن استدعاء دالة تحتوي على DML إلا من كتل PL/SQL أخرى.
  • يمكن أن يحتوي على كتل متداخلة، أو أن يكون متداخلاً داخل كتل أو حزم أخرى.
  • يحتوي على جزء إعلان (اختياري)، وجزء تنفيذ، وجزء معالجة الاستثناءات (اختياري).
  • يمكن تمرير القيم إلى الدالة أو جلبها منها من خلال المعلمات.
  • يجب تضمين هذه المعلمات في بيان الاستدعاء.
  • يمكن للدالة أيضًا إرجاع قيمة من خلال معلمات الإخراج بالإضافة إلى استخدام RETURN.
  • بما أنه يُرجع قيمة دائمًا، فإن عبارة الاستدعاء تستخدم دائمًا عامل التعيين لملء متغير.

بنية دالة PL/SQL

بناء الجملة

CREATE OR REPLACE FUNCTION
<function_name>
(
<parameter1 IN/OUT <datatype>
)
RETURN <datatype>
[ IS | AS ]
<declaration_part>
BEGIN
<execution part>
EXCEPTION
<exception handling part>
END;
  • يُوجّه الأمر CREATE FUNCTION المُصرّف لإنشاء دالة جديدة. بينما يُوجّه الأمر 'OR REPLACE' المُصرّف لاستبدال الدالة الموجودة (إن وُجدت) بالدالة الحالية.
  • يجب أن يكون اسم الدالة فريدًا.
  • يجب ذكر نوع بيانات الإرجاع.
  • تُستخدم الكلمة المفتاحية 'IS' عندما تكون الدالة مضمنة داخل كتلة أخرى. أما إذا كانت الدالة مستقلة، فتُستخدم الكلمة المفتاحية 'AS'.

مثال 1: إنشاء دالة واستدعائها باستخدام كتلة مجهولة. في هذا البرنامج، نقوم بإنشاء دالة تأخذ اسمًا كمدخل وتعيد رسالة ترحيب، باستخدام كتلة مجهولة وعبارة SELECT لاستدعائها.

إنشاء دالة PL/SQL واستدعائها

CREATE OR REPLACE FUNCTION welcome_msg_func ( p_name IN VARCHAR2) RETURN VARCHAR2
IS
BEGIN
RETURN ('Welcome '|| p_name);
END;
/
DECLARE
lv_msg VARCHAR2(250);
BEGIN
lv_msg := welcome_msg_func ('Guru99');
dbms_output.put_line(lv_msg);
END;
/
SELECT welcome_msg_func('Guru99') FROM DUAL;

Code التفسير:

  • Code السطر 1: إنشاء الدالة بالاسم 'welcome_msg_func' ومعامل واحد 'p_name' من النوع 'IN'.
  • Code السطر 2: تحديد نوع الإرجاع كـ VARCHAR2.
  • Code السطر 5: إرجاع القيمة المدمجة 'Welcome' وقيمة المعامل.
  • Code السطر 8: كتلة مجهولة لاستدعاء الدالة المذكورة أعلاه.
  • Code السطر 9: تعريف المتغير بنفس نوع البيانات الذي تم إرجاعه من الدالة.
  • Code السطر 11: استدعاء الدالة وتعبئة القيمة المرجعة في المتغير 'lv_msg'.
  • Code السطر 12: طباعة قيمة المتغير. الناتج هو "مرحباً" Guru99 ".
  • Code السطر 14: يتم استدعاء نفس الدالة من خلال عبارة SELECT. يتم توجيه القيمة المُعادة إلى المخرج القياسي.

أوجه التشابه بين الإجراء والوظيفة

  • يمكن استدعاء كلاهما من كتل PL/SQL أخرى.
  • إذا لم تتم معالجة الاستثناء الذي تم طرحه في البرنامج الفرعي في معالجة الاستثناءات القسم، ينتشر إلى كتلة الاستدعاء.
  • يمكن أن يحتوي كلاهما على العديد من المعلمات حسب الحاجة.
  • يتم التعامل مع كلاهما ككائنات قاعدة بيانات في PL/SQL.

الإجراء مقابل الوظيفة: الاختلافات الرئيسية

العملية الوظيفة
تُستخدم بشكل أساسي لتنفيذ عملية معينة. تُستخدم بشكل أساسي لإجراء بعض العمليات الحسابية.
لا يمكن استدعاؤها في عبارة SELECT. يمكن استدعاء دالة لا تحتوي على عبارات DML في عبارة SELECT.
يستخدم مُعامل إخراج (OUT) لإرجاع قيمة. يستخدم الأمر RETURN لإرجاع قيمة.
ليس من الضروري إرجاع قيمة. من الضروري إرجاع قيمة.
يؤدي الأمر RETURN ببساطة إلى إنهاء التحكم في البرنامج الفرعي. يُخرج الأمر RETURN التحكم من البرنامج الفرعي ويعيد القيمة أيضًا.
لم يتم تحديد نوع بيانات الإرجاع وقت الإنشاء. يُعد نوع بيانات الإرجاع إلزاميًا وقت الإنشاء.

وظائف مدمجة في PL/SQL

PL / SQL يحتوي على العديد من الدوال المدمجة للتعامل مع أنواع بيانات النصوص والتواريخ. فيما يلي الدوال الأكثر استخدامًا وكيفية استخدامها.

وظائف التحويل

تقوم هذه الوظائف المدمجة بتحويل نوع بيانات إلى آخر.

اسم الوظيفة الأستعمال مثال
TO_CHAR يحوّل نوع بيانات آخر إلى نوع بيانات حرفي. TO_CHAR(123);
TO_DATE (سلسلة نصية، تنسيق) يحوّل هذا البرنامج النص المُعطى إلى تاريخ. يجب أن يتطابق النص مع التنسيق المطلوب. TO_DATE('2015-JAN-15', 'YYYY-MON-DD'); الناتج: 1 / 15 / 2015
TO_NUMBER (نص، تنسيق) يحوّل النص إلى رقم بالصيغة المحددة. في هذه الصيغة، يشير الرقم '9' إلى عدد الأرقام. حدد TO_NUMBER('1234','9999') من ثنائي؛ الناتج: 1234. Select TO_NUMBER('1,234.45','9,999.99') from dual; الناتج: 1234.45

وظائف السلسلة

تُستخدم هذه الدوال على نوع بيانات الأحرف.

اسم الوظيفة الأستعمال مثال
INSTR(text, string, start, occurrence) يُحدد موضع نص معين في السلسلة النصية المُعطاة. النص هو السلسلة النصية الرئيسية، والنص هو النص المراد البحث عنه، والبداية هي موضع البداية (اختياري)، والتكرار هو عدد مرات ظهور السلسلة النصية التي تم البحث عنها (اختياري). حدد INSTR('AEROPLANE','E',2,1) من dual؛ الناتج2. حدد INSTR('AEROPLANE','E',2,2) من dual؛ الناتج9 (الظهور الثاني للحرف E)
SUBSTR (text, start, length) يُعطي قيمة السلسلة الفرعية من السلسلة الرئيسية. النص هو السلسلة الرئيسية، والبداية هي موضع البداية، والطول هو طول السلسلة الفرعية المراد استخراجها. حدد الجزء الفرعي ('aeroplane',1,7) من الجدول المزدوج؛ الناتج: ايروبلا
أعلى (نص) يُعيد النص المُقدّم بأحرف كبيرة. حدد الجزء العلوي ('guru99') من الثنائي؛ الناتج: جورو99
أسفل (نص) يُعيد النص المُقدّم بأحرف صغيرة. حدد الجزء السفلي من ('AerOpLane') من الجدول المزدوج؛ الناتج: طائرة
INITCAP (نص) يُعيد النص المُعطى مع كتابة الحرف الأول من كل كلمة بأحرف كبيرة. حدد INITCAP('guru99') من الجدول المزدوج؛ الناتج: Guru99. حدد INITCAP('my story') من dual؛ الناتج: قصتي
الطول (نص) يُعيد طول السلسلة النصية المُعطاة. حدد طول ('guru99') من الجدول المزدوج؛ الناتج: 6
LPAD (نص، طول، حرف الحشو) يقوم بإضافة أحرف إلى السلسلة الموجودة على اليسار حتى يصل طولها الإجمالي إلى الطول المحدد. حدد LPAD('guru99', 10, '$') من ثنائي؛ الناتج: $$$$ المعلم99
RPAD (النص، الطول، Pad_char) يقوم بإضافة أحرف إلى السلسلة على اليمين حتى يصل طولها الإجمالي إلى الطول المحدد. حدد RPAD('guru99',10,'-') من dual؛ الناتج: المعلم99 —-
LTRIM (نص) يقوم بحذف المساحة البيضاء الأولى من النص. حدد LTRIM(' Guru99') من ثنائي؛ الناتج: Guru99
RTRIM (نص) يقوم بحذف المساحة البيضاء الزائدة من نهاية النص. حدد RTRIM('Guru99 ') من المزدوج؛ الناتج: Guru99

وظائف التاريخ

تُستخدم هذه الدوال لمعالجة التواريخ.

اسم الوظيفة الأستعمال مثال
أضف_الأشهر (التاريخ، عدد الأشهر) يضيف الأشهر المحددة إلى التاريخ. ADD_MONTHS('2015-01-01',5); الناتج: 05 / 01 / 2015
تاريخ يُعيد التاريخ والوقت الحاليين للخادم. حدد SYSDATE من ثنائي؛ الناتج: 10/4/2015 2:11:43 مساءً
TRUNC يقوم بتقريب قيمة متغير التاريخ إلى أدنى قيمة ممكنة. حدد sysdate، TRUNC(sysdate) من ثنائي؛ الناتج: 10/4/2015 2:12:39 PM, 10/4/2015
ROUND يقوم بتقريب التاريخ إلى أقرب حد، سواء كان أعلى أو أقل. حدد تاريخ النظام، وتقريب (تاريخ النظام) من الجدول المزدوج؛ الناتج: 10/4/2015 2:14:34 PM, 10/5/2015
الأشهر_بين يُرجع عدد الأشهر بين تاريخين. حدد MONTHS_BETWEEN (sysdate+60, sysdate) من dual؛ الناتج: 2

الأسئلة الشائعة

يجب أن تُرجع الدالة قيمة، ويمكن استخدامها داخل عبارة SELECT إذا لم يكن لها أي عمليات DML. أما الإجراء، فيُشغّل عملية، ولا يُشترط أن يُرجع قيمة، ولا يمكن استدعاؤه من عبارة SELECT.

تُمرر الدالة IN قيمة للقراءة فقط إلى البرنامج الفرعي. تُعيد الدالة OUT قيمة إلى البرنامج المُستدعي. تقوم الدالة IN OUT بالأمرين معًا، حيث تستقبل قيمة وتُعيد قيمة أخرى قد تكون مُعدّلة عبر نفس المُعامل.

نعم، إذا لم تتضمن أي عمليات DML مثل INSERT أو UPDATE أو DELETE. لا يمكن استدعاء دالة تُنفذ عمليات DML إلا من كتلة PL/SQL أخرى، وليس مباشرةً داخل استعلام.

نعم. يمكن للذكاء الاصطناعي صياغة إجراء CREATE PROCEDURE أو دالة CREATE FUNCTION مع أوضاع المعلمات الصحيحة ونوع الإرجاع من وصف بسيط. Revراجع المعلمات ومعالجة الاستثناءات قبل النشر.

يستبدل الأمر OR REPLACE إجراءً أو دالة موجودة بنفس الاسم دون حذفها.ping قم بذلك أولاً. هذا يحافظ على المنح سليمة وهو الطريقة المعتادة لإعادة نشر برنامج فرعي تم تغييره.

تلخيص هذه التدوينة بـ: