it-swarm.asia

ما هي الاختلافات بين "الإجراءات المخزنة" و "الوظائف المخزنة"؟

إذن تعليق من هذا السؤال يذكر ، أن هناك اختلافًا طفيفًا في "الإجراءات المخزنة" و "الوظائف المخزنة" في PostgreSQL.

يرتبط التعليق بمقالة مقالة ويكيبيديا ولكن لا يبدو أن بعضها ينطبق (على سبيل المثال ، يمكن استخدامها في عبارة SELECT).

الجملة نفسها تبدو مربكة بعض الشيء:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

تقوم بإنشاء FUNCTION ولكن تشير إليه على أنه PROCEDURE.

إذن ما الفرق بين هذين؟

37
DrColossos

رسميا ، PostgreSQL لديه فقط "وظائف". يشار إلى وظائف المشغل أحيانًا باسم "إجراءات الزناد" ، ولكن هذا الاستخدام ليس له معنى واضح. داخليًا ، يُشار إلى الوظائف أحيانًا بالإجراءات ، كما هو الحال في كتالوج النظام pg_proc. هذا تعليق من PostQUEL. أي ميزات قد يربطها بعض الأشخاص (ربما لديهم خبرة في أنظمة قواعد البيانات المختلفة) بالإجراءات ، مثل صلتها بمنع حقن SQL أو استخدام معلمات الإخراج ، تنطبق أيضًا على الوظائف كما هي موجودة في PostgreSQL.

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

ومع ذلك ، من الناحية العملية ، فإن هذا التمييز بين الوظيفة مقابل الإجراء من حيث قدرات التحكم في المعاملات غير مقبول عالميًا ، وبالتأكيد فإن العديد من المبرمجين الذين ليس لديهم انحياز لقاعدة البيانات سيأخذون تفسيرًا يشبه باسكال للإجراء كدالة بدون قيمة إرجاع. (يبدو أن معيار SQL يتخذ أرضية وسطية ، حيث أن الإجراء الافتراضي الافتراضي له سلوك معاملة مختلف عن الوظيفة ، ولكن يمكن تعديل ذلك وفقًا لذلك. على أي حال ، وخاصة عند النظر في الأسئلة في Stack Exchange مع جمهور مختلط للغاية ، يجب عليك تجنب افتراض الكثير واستخدام مصطلحات أوضح أو تحديد الخصائص التي تتوقعها.

44
Peter Eisentraut

من حيث DDL ، ليس لدى Postgres كائنات إجراءات ، فقط وظائف. يمكن أن ترجع دالات Postgres القيمة (القيم) أو القيمة الباطلة بحيث تقوم بأدوار كل من الوظائف والإجراءات في RDBMSs الأخرى. كلمة "الإجراء" في create trigger تشير إلى دالة.

فيما يتعلق بوثائق Postgres ، فإن "الإجراء" هو أيضًا مرادف لكائن قاعدة البيانات يسمى دالة ، على سبيل المثال: " يتم إنشاء إجراء تشغيل باستخدام الأمر CREATE FUNCTION ".

تحتوي "إجراءات" المُشغل على قواعد معينة: يجب أن تكون تُعلن كدالة بدون وسيطات ونوع إرجاع من المُشغل . مثال هنا .

14
Jack says try topanswers.xyz

يتم استخدام المصطلحين "الإجراء المخزن" و "الوظيفة المخزنة" بالتبادل في PostgreSQL ويتم فهمهما بشكل عام ليعنيان نفس الشيء. قد تفرق قواعد البيانات الأخرى بين الإجراء والوظيفة (تشبه إلى حد كبير كيفية VB يفرق بين الوظائف الفرعية والوظائف).

طالما أن دالة في PostgreSQL تُرجع شيئًا يشبه الجدول ، يمكنك استخدام ناتج تلك الوظيفة كما لو كانت جدولًا قياسيًا. ال CREATE TRIGGER بناء الجملة مربك بعض الشيء ، لكنني أشك في أنه قد يكون في مكانه قبل الانتهاء من معيار ANSI. لدي نسخة فقط من SQL: 2003 ، لذلك لا يمكنني فعل أكثر من مجرد التكهن بالسبب الذي يجعل التسمية غريبة.

TL ؛ إصدار DR: مع إجراء "PostgreSQL" يعادل "الوظيفة".

8
Jeremiah Peschka

في MSSQL ، يعد الإجراء المخزن مجموعة معدة مسبقًا من أوامر SQL.
إجراء مخزن:

 - يمكن أن تحتوي على العديد من معلمات الإدخال والإخراج 
 - يمكن استخدامها لتعديل جداول/هياكل/بيانات قاعدة البيانات 
 - لا تُستخدم عادةً داخل عبارات الإدراج/التحديث/الحذف/التحديد 
 - يمكن أن يكون له معلمات إدخال متعددة ، ولكن لا يعرض سوى قيمة واحدة (أي سلسلة متسلسلة) 
 - يمكنه قبول مجموعة كمدخل ، وإرجاع قيمة واحدة (أي dbo.FindLargestPig (ListOfPigs)) 
 - إرجاع جدول (أي اختر * من dbo.ExplodeString ("هذه قائمة بالكلمات")) 
 - يمكن استخدامه في عبارات الاختيار/الإدراج/التحديث/الحذف 
 - لا يمكن استخدام تعديل جداول/هياكل/بيانات قاعدة البيانات 
6
datagod

الإجابة المختصرة هي أن الدالة ترجع قيمة ، لكن الإجراء لا.

كان هذا التمييز موجودًا في الوحدات النمطية المخزنة المستمرة (SQL/PSM) ، التي تم اقتراحها لـ SQL 1992. لا أعرف ما إذا كانت SQL/PSM قد دخلت في المعايير.

5
Mike Sherrill 'Cat Recall'

بمقارنة الإجابة المقبولة من المستوى المفاهيمي المجرد ، أفهم الفرق من منظور الوظيفة والإدخال/الإخراج. أدناه استخدمت sp و f لتمثيل الإجراء والوظيفة المخزنة ، على التوالي.

  1. الاستخدام في تعبير: لا يمكن استخدام sp في تعبير بينما يمكن استخدام الدالة ، مما يعني أنه يمكنك استخدام القيمة التي تم إرجاعها من f داخل عبارات أخرى ، مثل

    select * 
    from table 
    where col_a < (select col_A from f())
    
  2. إرجاع قيمة: sp لا يُرجع تلقائيًا قيمة ما لم تحدد refcursor نوع الإرجاع وفتح وإرجاع المؤشر ؛ تُرجع f النتيجة في العبارة الأخيرة حيث يتم تضمين عبارة "return" ، مثل عبارة تحديد .

  3. إرجاع مجموعات نتائج مفردة/متعددة: تشير مجموعات النتائج هنا إلى قائمة النتائج التي قد تختلف في التنسيق ، مثل مجموعة من عدد صحيح واحد ، ومصفوفة نصية ، وجدولين. يمكن لـ sp إرجاع مجموعات متعددة طالما قمت بتحديد نوع إرجاع refcursor وفتح وإرجاع المؤشر. ومع ذلك ، يمكن لـ f إرجاع نوع واحد فقط من المجموعة.

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

لمزيد من التفاصيل حول شرحي ، يرجى الرجوع إلى هذا الرابط: الإجراءات والوظائف المخزنة في PostgreSQL

2
Frank

لاحظ أنه في PostgreSQL 11 ، تمت إضافة الإجراءات المخزنة ككائن مخطط جديد. يمكنك إنشاء procudure جديد باستخدام CREATE PROCEDURE بيان.

تختلف الإجراءات المخزنة عن الوظائف بالطرق التالية:

  • الإجراءات المخزنة ليس لها قيمة إرجاع
  • يمكنك تنفيذ المعاملات واسترجاعها داخل الإجراءات المخزنة ، ولكن ليس في الوظائف
  • تقوم بتنفيذ إجراء مخزن باستخدام عبارة CALL بدلاً من عبارة SELECT.
1
d4nyll