إنشاء دالة واستخدامها في قاعدة بيانات Azure ل PostgreSQL

مكتمل

لقد تعلمنا بالفعل أن PostgreSQL يدعم لغات مختلفة. يمكن تصنيف الدالات إلى أربعة أنواع مختلفة:

  • الوظائف المكتوبة في SQL.
  • وظائف اللغة الإجرائية، المكتوبة بلغة إجرائية مدعومة مثل PL.pgSQL.
  • دالات داخلية.
  • وظائف لغة C.

بالإضافة إلى ذلك، يمكن أيضا تصنيف الغرض من الدالة على أنه متقلبأو غير قابل للتغيير أو مستقرة.

يمكن لدالة المتقلبة (الافتراضية) تعديل قاعدة البيانات وقد لا ترجع بالضرورة نفس النتيجة بنفس معلمات الإدخال في كل مرة. لذلك، في كل مرة يتم فيها استدعاء هذه الدالة، يجب إعادة تقييمها.

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

لا يمكن لدالة غير القابلة للتغيير تعديل قاعدة البيانات وإرجاع نفس النتائج إذا تم تمرير نفس الوسيطات، بغض النظر عن الاستعلام الذي يستدعيها.

يحدث تقلب الوظيفة فرقا كبيرا في الكفاءة التي يتعامل معها محسن الاستعلام.

إنشاء دالة

ترجع الدالة قيمة واحدة ويمكن استخدامها ضمن عبارة SELECT.

بناء الجملة لإنشاء دالة هو:

CREATE [OR REPLACE] FUNCTION
myfunction ([inputparam] type {default})
RETURNS returntype AS
$$
SQL body
$$
LANGUAGE 'language_name';
CREATE FUNCTION

كما هو الحال مع الإجراءات المخزنة، يتم استخدام الرمز $$ لبدء السلسلة وإنهاءها.

تأخذ الوظائف المعلمات التالية:

  • اسم - قم بتضمين اسم المخطط اختياريا.
  • argmode - وضع الوسيطة. يمكن أن يكون داخل أو خارج أو INOUT أو VARIADIC. الإعداد الافتراضي هو IN. VARDIAC هو عدد غير معرف من وسيطات الإدخال من نفس النوع، ويتبعه وسيطات OUT. لا يمكن استخدام وسيطات OUT و INOUT مع تدوينات جدول الإرجاع.
  • argname - اسم الوسيطة.
  • argtype - نوع بيانات الوسيطة. يمكن أن تكون أنواعا أساسية أو مركبة أو مجالا أو مرجعا لنوع عمود جدول. تتم كتابة نوع العمود على أنه table_name.column_name%TYPE. يمكن أن يساعد نوع البيانات هذا في جعل دالة مستقلة عن تغييرات تعريف الجدول.
  • t_expr - قيمة افتراضية (من نفس النوع) إذا لم يتم تحديد المعلمة. معلمات IN و INOUT فقط لها قيمة افتراضية. يجب أن تحتوي معلمات الإدخال التي تتبع معلمة بقيمة افتراضية أيضا على قيم افتراضية.
  • إعادة كتابة - نوع بيانات الإرجاع، والذي يمكن أن يكون نوع أساس أو مركب أو مجال، أو يشير إلى نوع عمود جدول. إذا لم ترجع الدالة قيمة، فحدد نوع الإرجاع على أنه ملغى. عند وجود معلمات OUT أو INOUT، يمكن حذف عبارة RETURNS. إذا كان موجودا، يجب أن يتفق مع نوع النتيجة الذي تتضمنه معلمات الإخراج: RECORD إذا كانت هناك معلمات إخراج متعددة، أو نفس نوع معلمة الإخراج الفردية. يشير معدل SETOF إلى أن الدالة ترجع مجموعة من العناصر، بدلا من عنصر واحد. تتم الإشارة إلى نوع العمود بكتابة table_name.
  • column_name - اسم عمود الإخراج في بناء جملة RETURNS TABLE. تعلن هذه المعلمة عن معلمة OUT مسماة، إلا أن الدالة RETURNS TABLE تعني أيضا إرجاع SETOF.
  • column_type - نوع بيانات عمود الإخراج في بناء جملة RETURNS TABLE.
  • lang_name - اللغة المستخدمة لكتابة الإجراء. الإعداد الافتراضي هو sql إذا تم تحديد sql_body. يمكن أن يكون sql أو c أو داخليا أو اسم لغة إجرائية معرفة من قبل المستخدم، على سبيل المثال، plpgsql.

استخدم الكلمات الأساسية IMMUTABLE أو STABLE أو VOLATILE كملمح لمحسن الاستعلام حول الدالة. التطاير هو الافتراضي.

استدعاء دالة

يمكن استخدام دالة في استعلام عن طريق تمرير أي معلمات ذات صلة إليها. على سبيل المثال:

SELECT myfunction(3), CatID, CatName
    FROM myCats

الدالات المضمنة

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

مثال على دالة سلسلة مضمنة هو سلسلة فرعية.

substring (*string* text [ FROM *start* integer ] [ FOR *count* integer ] ) → text

تأخذ هذه الدالة ثلاث معلمات إدخال:

  • سلسلة (كتابة نص)
  • بداية من (اكتب عدد صحيح)
  • FOR count (اكتب عددا صحيحا)

ترجع السلسلة الفرعية جزءا من نص الإدخال، بدءا من بدء الحرف، وإيقافها بعد حساب عدد الأحرف. على سبيل المثال:

substring('Thomas' from 2 for 3) → hom
substring('Thomas' from 3) → omas
substring('Thomas' for 2) → Th

هذه الدالة هي نفس السلسلة الفرعية:

substr ( *string* text, *start* integer [, *count* integer ] ) → text
substr('alphabet', 3) → phabet
substr('alphabet', 3, 2) → ph

ملاحظه

إذا كنت على دراية بالدالات، فستلاحظ أن الإصدار الأول يستخدم الكلمات الرئيسية بدلا من الفواصل لفصل الوسيطات. يوفر PostgreSQL كلا الإصدارين من هذه الدالات.