وظائف لتوثيق قواعد بيانات PostgreSQL. الجزء الثالث

هذا هو الجزء الثالث من المقالة الذي يصف الوظائف المعرفة من قبل المستخدم للعمل مع دلائل النظام: pg_class ، pg_attribute ، pg_constictions ، إلخ.

يناقش هذا القسم من المقالة الوظائف التي تُرجع خصائص التسلسلات والجداول الموروثة والخصائص الخاصة لسمات الجدول .

انظر أيضًا
وظائف لتوثيق قواعد بيانات PostgreSQL. الجزء الأول
وظائف لتوثيق قواعد بيانات PostgreSQL. الجزء الثاني ؛
وظائف لتوثيق قواعد بيانات PostgreSQL. النهاية (الجزء الرابع) .

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

هيكل دالة تقوم بارجاع كشف خصائص تسلسل الجدول



التين. 2. الوظائف التي تعتمد عليها وظائف admtf_Table_Sequences

الجدول 11. الغرض من الوظائف.

لا.العنوانالتعيين
1admtf_Sequence_Featuresتُرجع الدالة قائمة بخصائص تسلسل الجدول.
2admtf_Table_Sequencesتُرجع الدالة قائمة بتسلسل جدول قاعدة البيانات وخصائصها.

دالة Admtf_Sequence_Features - قائمة خصائص تسلسل قاعدة البيانات


تعرض الدالة admtf_Sequence_Features قائمة بخصائص SEQUENCE لقاعدة البيانات. يمكن عرض كود المصدر وتنزيله هنا .


تعرض الدالة admtf_Sequence_Features قائمة بخصائص تسلسل قاعدة البيانات ( SEQUENCE )

.

كمعلمات ، تأخذ الدالة اسم التسلسل ( a_SequenceName ) واسم المخطط الذي يتم إنشاء التسلسل داخله ( a_SchemaName ).


نشأت الحاجة إلى وظيفة admtf_Sequence_Features لأن الخصائص الرئيسية للتسلسل يتم تخزينها بالفعل في جدول يتطابق اسمه مع اسم التسلسل ، ويتم استخراج البيانات منه باستخدام عبارة SELECT . في هذه الحالة ، يتم تخزين اسم التسلسل واسم المخطط والتعليق على التسلسل في دلائل pg_class و pg_namespace و pg_description .


SELECT * FROM kr_road_network_vertices_pgr_id_seq; 

مالحظة 6


فصل PostgreSQL 10 خصائص التسلسل وخصائص حالاته. لهذا ، تم إدخال دليل pg_sequence بخصائص التسلسل ، يحتوي على القيمة الأولية ( start_value ) ، الزيادة ( increment_by ) والقيمة القصوى ( max_value ) للتسلسل. تم ترك القيمة الأخيرة التي تم إرجاعها بواسطة التسلسل ( last_value ) في "الجدول" باسم التسلسل.

نهاية الملاحظة.


أعتقد أن عرض كل تسلسل كمناظرة للجدول تمليه الحاجة إلى تخزين آخر قيمة مستخدمة للتسلسل ( last_value ) ، وهي خاصية لحالة التسلسل ، ولكن ليس التسلسل نفسه.


يختلف إدخال التسلسل في دليل pg_class عن إدخال الجدول حسب قيمة نوع العلاقة (relkind = 'S' ).


لاستخراج خصائص تسلسل عشوائي ، عليك استخدام SQL ديناميكي.


 EXECUTE 'SELECT last_value,start_value,increment_by,max_value FROM '|| LOWER(a_SchemaName)||'.'||LOWER(a_SequenceName) INTO v_SequenceLastValue,v_SequenceStartValue, v_SequenceIncrementBy,v_SequenceMaxValue ; 


الجدول 12. نتيجة تنفيذ الوظيفة admtf_Sequence_Features ('public'، 'kr_road_network_vertices_pgr_id_seq').

العنوانتعليقالحاليابدأزيادةالنهاية
kr_road_network
_vertices_pgr_id
_seq
تسلسل138023119223372036854775807

دالة admtf_Table_Sequences قائمة تسلسلات جدول قاعدة البيانات وخصائصها


تعرض الدالة admtf_Table_Sequences قائمة بالتسلسلات ( SEQUENCE ) لجدول قاعدة البيانات التي تولد قيم حقولها وخصائص هذه التسلسلات. يمكن عرض كود المصدر وتنزيله هنا ، وهنا نسخة من وظيفة لا تستخدم المؤشر .


كمعلمات ، تأخذ الوظيفة اسم الجدول المصدر ( a_TableName ) واسم المخطط الذي يتم إنشاء الجدول داخله (

a_SchemaName

)

كود المصدر للعامل في الشكل
 SELECT pseq.relname AS SequenceName,snsp.nspname AS SequenceSchemaName, COALESCE(dsc.description,',    ' ||da.attname) AS SequenceDescription, d.depType AS DependcyType,da.attname AS AttributeName FROM pg_depend d INNER JOIN pg_class pseq ON d.objid = pseq.oid INNER JOIN pg_namespace snsp ON pseq.relnamespace=snsp.oid LEFT OUTER JOIN pg_Description dsc ON pseq.oid=dsc.objoid AND dsc.objsubid=0 INNER JOIN pg_class tbl ON d.refobjid = tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid INNER JOIN pg_attribute da ON da.attrelid= d.refobjid AND da.attnum= d.refobjsubid WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableOID) AND tbl.relkind = 'r' AND pseq.relkind = 'S' ORDER BY pseq.relname; 


وصف التسلسل الواحد هو مزيج من سجل في pg_class يصفه بأنه علاقة مادية وجدول شرطي باسم التسلسل الذي يحتوي على بيانات حول الخصائص المحددة للتسلسل


يتم تخزين معلومات حول العلاقة بين التسلسل والجدول المصدر في دليل نظام pg_depend .



جدول 13. خصائص الدليل pg_dependent المطلوبة لتنفيذ الوظيفة.
العنوانالوصف
اعترضOID للتسلسل في دليل pg_class
objsubidيحتوي هذا الحقل على صفر
refobjidOID للجدول في الحقول التي يتم استخدام التسلسل
refobjsubidرقم سمة الجدول الذي يتم ملء قيمه باستخدام تسلسل

بالإضافة إلى ذلك ، تصل الوظيفة إلى بيانات الكتالوج pg_namespace و pg_description لاستخراج الرسوم البيانية والتعليقات لكل من التسلسل وجدول المصدر.


لتحديد سمة جدول يتم ملء قيمه باستخدام تسلسل ، تصل الوظيفة إلى دليل pg_attribute تحت الشرط: attrelid = refobjid AND attnum = refobjsubid . (في هذه الحالة ، تتم الإشارة إلى أسماء سمات الدليل pg_dependent إلى يمين علامة المساواة).


يتم استرداد الخصائص الخاصة لتسلسل الجدول في حلقة عن طريق استدعاء admtf_Sequence_Features . يتم استخدام الدورة لأنه يمكن تعيين أكثر من تسلسل لملء حقول الجدول.


جدول 14. نتيجة تنفيذ الوظيفة admtf_Table_Sequences ('public'، 'kr_road_network_vertices_pgr').

العنوانتعليقابدأزيادةالنهايةالمجال
kr_road_network
_vertices_pgr_id
_seq
إنشاء تسلسل قيم حقل المعرف119223372036854775807معرف

إصدار بدون مؤشر


في بيئة PostgreSQL التي يكون إصدارها أقل من 10 ، فمن المحتمل أن يكون من المستحيل تنفيذ وظيفة admtf_Table_Sequences بدون استخدام المؤشر.
لكن يمكن للمالكين المحظوظين للإصدار 10 الاستغناء عن المؤشر ، لأن لديهم دليل pg_sequence تحت تصرفهم. في هذه الحالة ، يمكن استرجاع كل خصائص التسلسل باستخدام عبارة SELECT واحدة.


في تنفيذ الوظيفة المحددة ، باستخدام دالة النافذة RANK () OVER (PARTITION BY pseq.relname) ، يتم حساب رقم التسلسل المتسلسل المستخدم لملء جدول المصدر.



كود المصدر للعامل في الشكل
 SELECT RANK() OVER (PARTITION BY pseq.relname) AS SequenceNo, pseq.relname AS SequenceName,snsp.nspname AS SequenceSchemaName, COALESCE(dsc.description,',    ' ||da.attname) AS SequenceDescription, seq.seqstart AS SequenceStartValue,seq.seqincrement AS SequenceIncrementBy, seq.seqmax AS SequenceMaxValue, d.depType AS DependcyType,da.attname AS AttributeName FROM pg_depend d INNER JOIN pg_class pseq ON d.objid = pseq.oid INNER JOIN pg_sequence seq ON seq.seqrelid= pseq.oid INNER JOIN pg_namespace snsp ON pseq.relnamespace=snsp.oid LEFT OUTER JOIN pg_Description dsc ON pseq.oid=dsc.objoid AND dsc.objsubid=0 INNER JOIN pg_class tbl ON d.refobjid = tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid INNER JOIN pg_attribute da ON da.attrelid= d.refobjid AND da.attnum= d.refobjsubid WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableOID) AND tbl.relkind = 'r' AND pseq.relkind = 'S' ORDER BY pseq.relname; 


الملاحظة 7

.

لا يُرجع هذا الإصدار من الدالة القيمة الأخيرة التي تم إنشاؤها بواسطة التسلسل ( last_value ).

نهاية الملاحظة.


دالة Admtf_Table_InheritanceChildrens - قائمة خصائص الجداول الموروثة


تُرجع الدالة admtf_Table_InheritanceChildrens قائمة بخصائص الجداول الموروثة ( INHERITS ) لجدول قاعدة البيانات. يمكن عرض كود المصدر وتنزيله هنا .


كمعلمات ، تأخذ الدالة اسم الجدول المصدر ( a_TableName ) واسم المخطط الذي يتم إنشاء الجدول داخله ( a_SchemaName ).


وصف جدول قديم واحد موجود في الإدخال في pg_class . ولكن للبحث عن الجداول الموروثة باسم جدول المصدر ، يجب عليك استخدام كتالوج النظام pg_dependent .


جدول 15. خصائص الدليل pg_dependent المطلوبة لتنفيذ الوظيفة.
العنوانالوصف
اعترضOID للجدول الموروث في دليل pg_class
refobjidOID لجدول المصدر


كود المصدر للعامل في الشكل
 SELECT rtbl.relname,rnspc.nspname,rdsc.description,rtbl.relnatts::INTEGER, rtbl.relchecks::INTEGER, rtbl.relhaspkey,rtbl.relhasindex,rtbl.relhassubclass, rtbl.reltuples::INTEGER FROM pg_class tbl INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid LEFT OUTER JOIN pg_Description dsc ON tbl.oid=dsc.objoid AND dsc.objsubid=0 INNER JOIN pg_depend dp ON tbl.oid=dp.refobjid INNER JOIN pg_class rtbl ON rtbl.OID=dp.objid INNER JOIN pg_namespace rnspc ON rtbl.relnamespace = rnspc.oid LEFT OUTER JOIN pg_Description rdsc ON rtbl.oid=rdsc.objoid AND rdsc.objsubid=0 WHERE LOWER(nspc.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableOID) AND tbl.relkind = 'r' AND rtbl.relkind = 'r' ORDER BY rtbl.relname; 


بالإضافة إلى ذلك ، تصل الوظيفة إلى بيانات الدليل pg_namespace و pg_description من أجل استخراج المخططات والتعليقات لكل من الجدول الموروث والجدول المصدر.


الجدول 16. نتيجة تنفيذ الوظيفة admtf_Table_InheritanceChildrens ('public'، 'np_house').

العنوانتعليقالسمات؟؟؟ المفتاح الأساسي؟؟؟ المؤشرات؟؟؟ أحفادعدد السجلات
np_house 04201000000منازل في المستوطنات (منطقة أتشينسكي)15ووو5651
np_house 4208000.000منازل في المستوطنات (منطقة بوغوتولسكي)15ووو4314

يتم تحديد عدد السجلات في الجدول الذي تم إنشاؤه من السمة reltuple للدليل pg_class. وعلى الرغم من أن هذه القيمة غالبًا ما تتطابق تمامًا مع العدد الفعلي للإدخالات في الجدول ، إلا أنها لا تزال قيمة تقديرية. لذا ، قد ترغب في الحصول على القيمة الدقيقة نتيجة لذلك. على سبيل المثال ، كما هو موضح في الشكل.


 EXECUTE 'SELECT COUNT(*) FROM '||LOWER(a_SchemaName)||'.'||LOWER(a_TableName) INTO v_TableNumberOfRowCalc; 

ولكن ، أولاً ، من أجل تحقيق هذا البيان في النص ، سيتعين على الدالة admtf_Table_InheritanceChildrens استخدام المؤشر.


ثانيًا ، أرغب في أن تعرض الوظيفة كلاً من العدد المُقدَّر والعدد الدقيق لإدخالات الجدول.


لذلك ، تحتوي الوظيفة على معلمة اختيارية أخرى - وضع الحصول على عدد إدخالات الجدول ( a_Mode ) ، والتي تأخذ القيم "تقدير" ( تقدير ) أو "بالضبط" ( بالضبط ).



بالإضافة إلى ذلك ، تم إنشاء وظيفة admfn_Table_RowCount ، والتي تُرجع العدد الدقيق لإدخالات الجدول ، ويتم استبدال السمة reltuple في قائمة الإرجاع SELECT بالبناء التالي.



كود المصدر للعامل في الشكل
 CASE WHEN a_Mode = 'exactly' THEN admfn_Table_RowCount(rnspc.nspname,rtbl.relname) ELSE reltuples END 


ونتيجة لذلك ، تقوم الدالة بإرجاع القيمة المقدرة للمؤشر "عدد إدخالات الجدول" إذا لم تحدد المعلمة a_Mode متطلبات إرجاع القيمة الدقيقة.


هيكل دالة تقوم بارجاع كشف خصائص الجدول



التين. 3. الوظائف التي تقبل المكالمات

نسخة نصية من الجدول في الشكل
الجدول 17. الغرض من الوظائف.

لا.العنوانالتعيين
1admtf_Attribute_PK الميزاتتُرجع الدالة سمة حضور السمة في المفتاح الأساسي (PRIMARY KEY) ، بالإضافة إلى بعض خصائصها كجزء من هذا المفتاح.
2admtf_Attribute_FK الميزاتتقوم الدالة بإرجاع سمة حضور السمة في المفتاح الخارجي (مفتاح FOREIGN) ، بالإضافة إلى بعض خصائصها كجزء من هذا المفتاح.
3admtf_Attribute_Featuresتعرض الدالة قائمة بخصائص سمات الجدول.


الوظيفة admtf_Attribute_PKFeatures - - ما إذا كانت السمة موجودة في المفتاح الأساسي



تعرض الدالة admtf_Attribute_PKFeatures علامة على وجود سمة جدول في المفتاح الأساسي (المفتاح الأساسي) للجدول ، وإذا كان موجودًا ، فما هو الرقم التسلسلي في هذا المفتاح ، حيث يمكن أن يكون المفتاح الأساسي مركب.
يمكن عرض كود المصدر وتنزيله هنا .


كمعلمات ، تأخذ الدالة OID لجدول المصدر ( a_TableOID ) والرقم التسلسلي للسمة المطلوبة فيه ( a_AttributeNo ).


تستخرج الوظيفة البيانات المطلوبة من إدخال دليل pg_constraint الذي يحتوي على قيود (CONSTRAINT) لجدول المصدر ، بما في ذلك قيد المفتاح الأساسي. يتم تخزين معرّف الكائن ( OID) ​​للجدول المطلوب في الحقل المرتبط ، ويتم تخزين وصف المفتاح الأساسي في سجل يحتوي فيه حقل النمط على القيمة "" p "

.
 SELECT INTO v_PKAttributeList,rs_isAttributePK conkey,ARRAY[a_AttributeNo]<@conkey FROM pg_constraint c WHERE c.contype='p' AND c.conrelid=a_TableOID; 

يحتوي حقل المفتاح ، الموجود بهذه الطريقة ، على مجموعة من أرقام السمات التي تشكل المفتاح الأساسي. لذلك ، للتحقق من وجود السمة المصدر في المفتاح الأساسي ، يكفي لحساب التعبير المنطقي ARRAY [a_AttributeNo] <@ conkey .


إذا كانت السمة موجودة في المفتاح الأساسي ، فسيتم حساب رقم التسلسل الخاص بها في الحلقة.


الوظيفة admtf_Attribute_FKFeatures - ما إذا كانت السمة موجودة في المفتاح الخارجي



تُرجع الدالة admtf_Attribute_FKFeatures علامة وجود سمة جدول في مفتاح خارجي واحد أو أكثر (مفتاح أجنبي) للجدول ، وإذا كانت موجودة ، ما هي أرقام تسلسلها في هذه المفاتيح ، لأن يمكن أن يكون المفتاح الأجنبي مركبًا.

يمكن عرض كود المصدر وتنزيله هنا .


كمعلمات ، تأخذ الدالة OID لجدول المصدر ( a_TableOID ) والرقم التسلسلي للسمة المطلوبة فيه ( a_AttributeNo ).


تسترد الوظيفة البيانات المطلوبة من إدخال دليل pg_constraint الذي يحتوي على CONSTRAINT لجدول المصدر ، بما في ذلك ، على سبيل المثال لا الحصر ، قيود المفتاح الخارجي. يتم تخزين معرّف الكائن ( OID) ​​للجدول المطلوب في الحقل المرتبط ، ويتم تخزين وصف المفتاح الأساسي في سجل يحتوي فيه حقل النمط على القيمة '' f '

.
 SELECT * FROM pg_constraint c WHERE c.contype='f ' AND c.conrelid=a_TableOID AND ARRAY[a_AttributeNo]<@conkey ORDER BY c.oid; 

يحتوي حقل conkey ، الموجود بهذه الطريقة ، على مجموعة من أرقام السمات التي تشكل المفتاح الخارجي. لذلك ، من أجل التحقق من وجود السمة المصدر في المفتاح الخارجي ، يكفي لحساب التعبير المنطقي ARRAY [a_AttributeNo] <@ conkey .


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


يتم استرداد أسماء الجداول من إدخال دليل pg_class من خلال المعرف (OID) الذي تم استرجاعه من الحقل المرتبط لإدخال المفتاح الخارجي.


للحصول على اسم سمة الجدول الخارجي ، استخدم مجموعة من الأرقام التسلسلية من الحقل

كونكي

(يختلف عن المصفوفة أعلاه بالحرف " f " في الاسم). يتم استخراج الرقم التسلسلي لسمة الجدول الخارجي التي تتوافق معها السمة الخارجية من هذا الصفيف. من خلال هذا الرقم التسلسلي لسمة الجدول الخارجي و OID الخاص به ، الموجود في دليل pg_attribute ، يوجد إدخال لوصف السمة ويتم استرداد اسمها.

دالة Admtf_Attribute_Features - قائمة خصائص سمات الجدول


تعرض الدالات admtf_Attribute_Features قائمة بخصائص سمات الجدول التالية. يمكن عرض كود المصدر وتنزيله هنا .



نسخة النص من الجدول في الشكل
لا.العنواناكتبالتعيين
1اسم السمةالاسماسم سمة المصدر.
2اسم المستخدمفاركار (256)نوع سمة المصدر المخصص
3اسم الملففاركار (256)النوع الأساسي لسمة المصدر
4isNotNULLBOOLEAN؟؟؟ صلاحية فارغة
5isAttributePKBOOLEAN؟؟؟ المشاركة في PK
6العمود PKسمالينتالسمة الرقم التسلسلي في PK
7الوصفالنصالتعليق على سمة المصدر
8isAttributeFKBOOLEAN؟؟؟ المشاركة في FK
9FKeyNameالاسم []صفيف من أسماء جدول القيد التي يتم فيها تعريف المفتاح الخارجي
10العمود FKسمالينت []صفيف من أرقام تسلسل السمات في المفاتيح الخارجية للجدول
11FKTableNameالاسم []صفيف الجداول المشار إليها بواسطة المفاتيح الخارجية
12FKTableColumnNameالاسم []صفيف من أسماء السمات في الجداول الخارجية المقابلة لسمة المصدر


كمعلمات ، تأخذ الدالة OID لجدول المصدر ( a_TableOID ) والرقم التسلسلي للسمة المطلوبة فيه ( a_AttributeNo ).
يتم استرداد قيم حقلي AttributeName و isNotNULL من إدخال دليل pg_attribute المقابل لقيم معلمات الإدخال.


 SELECT attr.attname, attr.attnotnull FROM pg_attribute attr WHERE attr.attrelid =a_TableOID AND attr.attnum=a_AttributeNo; SELECT rs_isAttributePK,rs_ColumnPKNo FROM admtf_Attribute_PKFeatures (a_TableOID,a_AttributeNo); SELECT rs_isAttributeFK,rs_FKeyName,rs_ColumnFKNo, rs_FKTableName,rs_FKTableColumnName FROM admtf_Attribute_FKFeatures (a_TableOID,a_AttributeNo); 

يتم إرجاع قيم حقلي isAttributePK و ColumnPKNo بواسطة الدالة admtf_Attribute_PKFeatures .


يتم إرجاع قيم الحقول isAttributeFK و FKeyName و ColumnFKNo و FKTableName و FKTableColumnName بواسطة الدالة admtf_Attribute_FKFeatures .


سيؤدي استدعاء admtf_Attribute_Features ((SELECT OID FROM pg_class WHERE relname = 'street')، 2 :: SMALLINT) إلى النتيجة التالية.


جدول 18. نتيجة تنفيذ الوظيفة admtf_Attribute_Features
اسم السمةاسم المستخدماسم الملفisNotNULLisAttributePKالعمود PK
محليةمحليةعدد صحيحعدد صحيحعدد صحيحعدد صحيح


الوصفisAttributeFKFKeyNameالعمود FKFKTableNameFKTableColumnName
هوية المجتمعر{fk_street_locality}{2}{locality}{localityid}

الملحق 1. النصوص


إنشاء وظيفة admtf_Sequence_Features


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Sequence_Features (a_SchemaName NAME,a_SequenceName NAME); /****************************************************************************/ /*     ,   */ /****************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Sequence_Features (a_SchemaName NAME default 'public', /*     */ a_SequenceName NAME default NULL /*   */ ) RETURNS TABLE (rs_SequenceName NAME,rs_SequenceDescription TEXT,rs_NumberOfAttribute INTEGER,rs_SequenceLastValue BIGINT, rs_SequenceStartValue BIGINT,rs_SequenceIncrementBy BIGINT,rs_SequenceMaxValue BIGINT) AS $BODY$ DECLARE c_SequenceKind CONSTANT CHAR:='S'; v_SequenceOID OID; /*   */ v_SequenceName NAME; /*   */ v_SequenceDescription TEXT; /*   */ v_SequenceStartValue BIGINT; /*    */ v_SequenceIncrementBy BIGINT; /*   */ v_SequenceMaxValue BIGINT; /*    */ v_SequenceLastValue BIGINT; /*    */ v_SequenceNumberOfRowCalc INTEGER; /*     */ --************************************************************************ BEGIN SELECT INTO rs_SequenceName,rs_SequenceDescription,rs_NumberOfAttribute tbl.relname, COALESCE(dsc.description,'') AS r_SequenceDescription, tbl.relnatts::INTEGER,tbl.relchecks::INTEGER,tbl.relhaspkey, tbl.relhasindex,tbl.relhassubclass,tbl.reltuples::INTEGER FROM pg_class tbl INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid LEFT OUTER JOIN pg_Description dsc ON tbl.oid=dsc.objoid AND dsc.objsubid=0 WHERE nspc.nspname=LOWER(a_SchemaName) AND tbl.relkind=c_SequenceKind AND tbl.relname =LOWER(a_SequenceName); IF FOUND THEN EXECUTE 'SELECT last_value,start_value,increment_by,max_value FROM '||LOWER(a_SchemaName)||'.'||LOWER(a_SequenceName) INTO v_SequenceLastValue,v_SequenceStartValue, v_SequenceIncrementBy,v_SequenceMaxValue ; RETURN QUERY SELECT rs_SequenceName,rs_SequenceDescription, rs_NumberOfAttribute,v_SequenceLastValue, v_SequenceStartValue,v_SequenceIncrementBy, v_SequenceMaxValue; END IF; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Sequence_Features(a_SchemaName NAME,a_SequenceName NAME) IS '    ,  '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Sequence_Features (a_SchemaName VARCHAR(256),a_SequenceName VARCHAR(256)); /****************************************************************************/ /*     ,   */ /****************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Sequence_Features (a_SchemaName VARCHAR(256) default 'public', /*     */ a_SequenceName VARCHAR(256) default NULL /*   */ ) RETURNS TABLE (rs_SequenceName VARCHAR(256),rs_SequenceDescription TEXT, rs_NumberOfAttribute INTEGER,rs_SequenceLastValue BIGINT, rs_SequenceStartValue BIGINT,rs_SequenceIncrementBy BIGINT, rs_SequenceMaxValue BIGINT) AS $BODY$ DECLARE c_SequenceKind CONSTANT CHAR:='S'; --******************************************************** BEGIN RETURN QUERY SELECT sf.rs_SequenceName::VARCHAR(256), sf.rs_SequenceDescription::TEXT, sf.rs_NumberOfAttribute::INTEGER, sf.rs_SequenceLastValue::BIGINT, sf.rs_SequenceStartValue::BIGINT, sf.rs_SequenceIncrementBy::BIGINT, sf.rs_SequenceMaxValue::BIGINT FROM admtf_Sequence_Features(a_SchemaName::NAME,a_SequenceName::NAME) sf; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Sequence_Features(a_SchemaName VARCHAR(256),a_SequenceName VARCHAR(256)) IS '    ,  '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Sequence_Features('public'::VARCHAR(255),'k_dorogi_dijkstra_seq_seq'::VARCHAR(255)); SELECT * FROM admtf_Sequence_Features('public'::NAME,'kr_road_network_vertices_pgr_id_seq'::NAME); 



إنشاء دالة admtf_Table_Sequences


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Sequences (a_SchemaName NAME, a_TableName NAME); /*********************************************************************/ /*    ,     */ /*********************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Sequences (a_SchemaName NAME default 'public', /*     */ a_TableName NAME default NULL /*   */ ) RETURNS TABLE (r_SequenceNumber SMALLINT,r_SequenceName NAME, r_SequenceSchemaName NAME,r_SequenceDescription TEXT, r_SequenceStartValue BIGINT,r_SequenceIncrementBy BIGINT, r_SequenceMaxValue BIGINT,r_DependType NAME, r_RefTableName NAME,r_RefTableSchemaName NAME, r_RefAttributeName NAME) AS $BODY$ DECLARE v_TableOID INTEGER;/* OID */ v_Sequence RECORD;/*   */ v_SequenceOID INTEGER;/* OID */ v_SequenceName NAME; /*   */ v_SequenceSchemaName NAME; /*    */ v_SequenceDescription TEXT; /*   */ v_SequenceStartValue BIGINT; /*    */ v_SequenceIncrementBy BIGINT; /*   */ v_SequenceMaxValue BIGINT; /*    */ v_DependcyType NAME; /*     */ /*    */ v_AttributeName NAME; /*  */ v_SequenceNumber SMALLINT; /*   */ c_Delimiter CONSTANT VARCHAR(2):=','; --********************************************************************* BEGIN v_SequenceNumber:=0; FOR v_Sequence IN SELECT pseq.relname AS SequenceName, snsp.nspname AS SequenceSchemaName, COALESCE(dsc.description,',    '||da.attname) AS SequenceDescription, d.depType AS DependcyType,da.attname AS AttributeName FROM pg_depend d INNER JOIN pg_class pseq ON d.objid = pseq.oid INNER JOIN pg_namespace snsp ON pseq.relnamespace=snsp.oid LEFT OUTER JOIN pg_Description dsc ON pseq.oid=dsc.objoid AND dsc.objsubid=0 INNER JOIN pg_class tbl ON d.refobjid = tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid INNER JOIN pg_attribute da ON da.attrelid= d.refobjid AND d.refobjsubid=da.attnum WHERE tbl.relkind = 'r' AND pseq.relkind = 'S' AND LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableName) ORDER BY pseq.relname LOOP v_SequenceNumber:=v_SequenceNumber+1; v_SequenceName:=v_Sequence.SequenceName; v_SequenceSchemaName:=v_Sequence.SequenceSchemaName; v_DependcyType:=v_Sequence.DependcyType; v_AttributeName:=v_Sequence.AttributeName; v_SequenceDescription:=v_Sequence.SequenceDescription; SELECT INTO v_SequenceStartValue,v_SequenceIncrementBy, v_SequenceMaxValue rs_SequenceStartValue,rs_SequenceIncrementBy, rs_SequenceMaxValue FROM admtf_Sequence_Features(v_SequenceSchemaName,v_SequenceName); RETURN QUERY SELECT v_SequenceNumber,v_SequenceName, v_SequenceSchemaName,v_SequenceDescription, v_SequenceStartValue,v_SequenceIncrementBy, v_SequenceMaxValue,v_DependcyType, a_TableName,a_SchemaName,v_AttributeName; END LOOP; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Sequences(a_SchemaName NAME, a_TableName NAME) IS '  ,    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Sequences (a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)); /**********************************************************************/ /*    ,     */ /**********************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Sequences (a_SchemaName VARCHAR(256) default 'public', /*     */ a_TableName VARCHAR(256) default NULL /*   */ ) RETURNS TABLE (r_SequenceNumber SMALLINT,r_SequenceName VARCHAR(256), r_SequenceSchemaName VARCHAR(256),r_SequenceDescription TEXT, r_SequenceStartValue BIGINT,r_SequenceIncrementBy BIGINT, r_SequenceMaxValue BIGINT,r_DependType VARCHAR(256), r_RefTableName VARCHAR(256),r_RefTableSchemaName VARCHAR(256), r_RefAttributeName VARCHAR(256)) AS $BODY$ DECLARE c_Delimiter CONSTANT VARCHAR(2):=','; --****************************************************** BEGIN RETURN QUERY SELECT ts.r_SequenceNumber::SMALLINT, ts.r_SequenceName::VARCHAR(256), ts.r_SequenceSchemaName::VARCHAR(256) , ts.r_SequenceDescription::TEXT, ts.r_SequenceStartValue::BIGINT, ts.r_SequenceIncrementBy::BIGINT, ts.r_SequenceMaxValue::BIGINT, ts.r_DependType::VARCHAR(256), ts.r_RefTableName::VARCHAR(256), ts.r_RefTableSchemaName::VARCHAR(256), ts.r_RefAttributeName::VARCHAR(256) FROM admtf_Table_Sequences(a_SchemaName::NAME,a_TableName::NAME) ts; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Sequences(a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)) IS '  ,    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Table_Sequences('public'::VARCHAR(255),'kr_road_network_vertices_pgr'::VARCHAR(255)); SELECT * FROM admtf_Table_Sequences('public'::NAME,'kr_road_network_vertices_pgr'::NAME); 


إنشاء دالة admtf_Table_Sequences بدون مؤشر (PostgreSQL 10)


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Sequences (a_SchemaName NAME, a_TableName NAME); /*********************************************************************/ /*    ,     */ /**********************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Sequences (a_SchemaName NAME default 'public', /*     */ a_TableName NAME default NULL /*   */ ) RETURNS TABLE (r_SequenceNumber SMALLINT,r_SequenceName NAME, r_SequenceSchemaName NAME,r_SequenceDescription TEXT, r_SequenceStartValue BIGINT,r_SequenceIncrementBy BIGINT, r_SequenceMaxValue BIGINT,r_DependType NAME, r_RefTableName NAME,r_RefTableSchemaName NAME, r_RefAttributeName NAME) AS $BODY$ DECLARE v_TableOID INTEGER; /* OID */ v_Sequence RECORD; /*   */ v_SequenceOID INTEGER; /* OID */ v_SequenceName NAME; /*   */ v_SequenceSchemaName NAME; /*    */ v_SequenceDescription TEXT; /*   */ v_SequenceStartValue BIGINT; /*    */ v_SequenceIncrementBy BIGINT; /*   */ v_SequenceMaxValue BIGINT; /*    */ v_DependcyType NAME; /*        */ v_AttributeName NAME; /*  */ v_SequenceNumber SMALLINT; /*   */ c_Delimiter CONSTANT VARCHAR(2):=','; --****************************************************************** BEGIN v_SequenceNumber:=0; FOR v_Sequence IN SELECT pseq.relname AS SequenceName, snsp.nspname AS SequenceSchemaName, COALESCE(dsc.description,',    '||da.attname) AS SequenceDescription, d.depType AS DependcyType,da.attname AS AttributeName FROM pg_depend d INNER JOIN pg_class pseq ON d.objid = pseq.oid INNER JOIN pg_namespace snsp ON pseq.relnamespace=snsp.oid LEFT OUTER JOIN pg_Description dsc ON pseq.oid=dsc.objoid AND dsc.objsubid=0 INNER JOIN pg_class tbl ON d.refobjid = tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid INNER JOIN pg_attribute da ON da.attrelid= d.refobjid ND d.refobjsubid=da.attnum WHERE tbl.relkind = 'r' AND pseq.relkind = 'S' AND LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableName) ORDER BY pseq.relname LOOP v_SequenceNumber:=v_SequenceNumber+1; v_SequenceName:=v_Sequence.SequenceName; v_SequenceSchemaName:=v_Sequence.SequenceSchemaName; v_DependcyType:=v_Sequence.DependcyType; v_AttributeName:=v_Sequence.AttributeName; v_SequenceDescription:=v_Sequence.SequenceDescription; SELECT INTO v_SequenceStartValue,v_SequenceIncrementBy,v_SequenceMaxValue rs_SequenceStartValue,rs_SequenceIncrementBy,rs_SequenceMaxValue FROM admtf_Sequence_Features(v_SequenceSchemaName,v_SequenceName); RETURN QUERY SELECT v_SequenceNumber,v_SequenceName, v_SequenceSchemaName,v_SequenceDescription, v_SequenceStartValue,v_SequenceIncrementBy, v_SequenceMaxValue,v_DependcyType, a_TableName,a_SchemaName,v_AttributeName; END LOOP; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Sequences(a_SchemaName NAME, a_TableName NAME) IS '  ,    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Sequences (a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)); /**********************************************************************/ /*    ,     */ /**********************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Sequences (a_SchemaName VARCHAR(256) default 'public', /*     */ a_TableName VARCHAR(256) default NULL /*   */ ) RETURNS TABLE (r_SequenceNumber SMALLINT,r_SequenceName VARCHAR(256), r_SequenceSchemaName VARCHAR(256),r_SequenceDescription TEXT, r_SequenceStartValue BIGINT,r_SequenceIncrementBy BIGINT, r_SequenceMaxValue BIGINT,r_DependType VARCHAR(256), r_RefTableName VARCHAR(256),r_RefTableSchemaName VARCHAR(256), r_RefAttributeName VARCHAR(256)) AS $BODY$ DECLARE c_Delimiter CONSTANT VARCHAR(2):=','; --******************************************************* BEGIN RETURN QUERY SELECT ts.r_SequenceNumber::SMALLINT, ts.r_SequenceName::VARCHAR(256), ts.r_SequenceSchemaName::VARCHAR(256), ts.r_SequenceDescription::TEXT, ts.r_SequenceStartValue::BIGINT, ts.r_SequenceIncrementBy::BIGINT, ts.r_SequenceMaxValue::BIGINT, ts.r_DependType::VARCHAR(256), ts.r_RefTableName::VARCHAR(256), ts.r_RefTableSchemaName::VARCHAR(256), ts.r_RefAttributeName::VARCHAR(256) FROM admtf_Table_Sequences(a_SchemaName::NAME,a_TableName::NAME) ts; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Sequences(a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)) IS '  ,    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Table_Sequences('public'::VARCHAR(255), 'kr_road_network_vertices_pgr'::VARCHAR(255)); SELECT * FROM admtf_Table_Sequences('public'::NAME, 'kr_road_network_vertices_pgr'::NAME); 



إنشاء وظيفة admfn_Table_RowCount


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admfn_Table_RowCount (a_SchemaName NAME,a_TableName NAME); /******************************************************/ /*       */ /******************************************************/ CREATE OR REPLACE FUNCTION admfn_Table_RowCount (a_SchemaName NAME default 'public',/*     */ a_TableName NAME default NULL /*   */ ) RETURNS BIGINT AS $BODY$ DECLARE v_TableNumberOfRowCalc BIGINT; /*  */ v_Found BOOLEAN; --*********************************************************** BEGIN IF a_SchemaName ~ E'^[a-z_0-9]+$' AND a_TableName ~ E'^[a-z_0-9]+$' THEN EXECUTE 'SELECT count(*) FROM ' ||a_SchemaName ||'.'|| a_TableName INTO v_TableNumberOfRowCalc; ELSE SELECT INTO v_Found true FROM pg_class tbl INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid WHERE tbl.relkind='r' AND tbl.relname=a_TableName AND nspc.nspname=a_SchemaName; IF FOUND THEN EXECUTE 'SELECT count(*) FROM ' || CASE WHEN a_SchemaName ~ E'^[a-z_0-9]+$' THEN a_SchemaName ELSE quote_ident(a_SchemaName) END ||'.'|| CASE WHEN a_TableName ~ E'^[a-z_0-9]+$' THEN a_TableName ELSE quote_ident(a_TableName) END INTO v_TableNumberOfRowCalc; ELSE SELECT INTO v_Found true FROM pg_class tbl INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid WHERE tbl.relkind='r' AND LOWER(tbl.relname)= LOWER(a_TableName) AND nspc.nspname=LOWER(a_SchemaName); IF FOUND THEN EXECUTE 'SELECT count(*) FROM ' || a_SchemaName ||'.'||a_TableName INTO v_TableNumberOfRowCalc; END IF; END IF; END IF; RETURN v_TableNumberOfRowCalc; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admfn_Table_RowCount(a_SchemaName NAME,a_TableName NAME) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION;BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admfn_Table_RowCount (a_SchemaName VARCHAR(256),a_TableName VARCHAR(256)); /********************************************************************/ /*       */ /********************************************************************/ CREATE OR REPLACE FUNCTION admfn_Table_RowCount (a_SchemaName VARCHAR(256) default 'public',/*     */ a_TableName VARCHAR(256) default NULL /*   */ ) RETURNS BIGINT AS $BODY$ DECLARE v_TableNumberOfRowCalc BIGINT; /*  */ --********************************************************* BEGIN RETURN admfn_Table_RowCount(a_SchemaName::NAME,a_TableName::NAME); END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admfn_Table_RowCount(a_SchemaName VARCHAR(256),a_TableName VARCHAR(256)) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECt admfn_Table_RowCount('public'::NAME,'Street'::NAME); SELECt admfn_Table_RowCount('public'::VARCHAR(256),'Street'::VARCHAR(256)); 


إنشاء دالة admtf_Table_InheritanceChildrens


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_InheritanceChildrens (a_SchemaName NAME,a_TableName NAME,a_Mode VARCHAR(10)); /************************************************************/ /*       */ /************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_InheritanceChildrens (a_SchemaName NAME default 'public', /*     */ a_TableName NAME default NULL, /*   */ a_Mode VARCHAR(10) default 'estimate' /*     */ ) RETURNS TABLE (rs_TableName NAME,rs_TableDescription TEXT, rs_NumberOfAttribute INTEGER,rs_NumberOfChecks INTEGER, rs_hasPKey BOOLEAN,rs_hasIndex BOOLEAN, rs_hasSubClass BOOLEAN,rs_NumberOfRow INTEGER) AS $BODY$ DECLARE c_TableKind CONSTANT CHAR:='r'; c_ExactlyMode CONSTANT VARCHAR(10):='exactly'; c_EstimateMode CONSTANT VARCHAR(10):='estimate'; v_TableOID OID; /*   */ v_SchemaName NAME; /*    */ v_TableName NAME; /*   */ v_TableDescription TEXT; /*   */ v_TableNumberOfRowCalc INTEGER; /*     */ v_InheritanceRECORD RECORD; /*    */ v_InheritanceOID OID; /*    */ BEGIN RETURN QUERY SELECT rtbl.relname,rdsc.description,rtbl.relnatts::INTEGER, rtbl.relchecks::INTEGER,rtbl.relhaspkey,rtbl.relhasindex, rtbl.relhassubclass, CASE WHEN a_Mode=c_ExactlyMode THEN admfn_Table_RowCount(rnspc.nspname,rtbl.relname)::INTEGER ELSE rtbl.reltuples::INTEGER END FROM pg_class tbl INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid LEFT OUTER JOIN pg_Description dsc ON tbl.oid=dsc.objoid AND dsc.objsubid=0 INNER JOIN pg_depend dp ON tbl.oid=dp.refobjid INNER JOIN pg_class rtbl ON rtbl.OID=dp.objid INNER JOIN pg_namespace rnspc ON rtbl.relnamespace = rnspc.oid LEFT OUTER JOIN pg_Description rdsc ON rtbl.oid=rdsc.objoid AND rdsc.objsubid=0 WHERE nspc.nspname=LOWER(a_SchemaName) AND tbl.relkind=c_TableKind AND rtbl.relkind=c_TableKind AND tbl.relname =LOWER(a_TableName) ORDER BY rtbl.relname; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_InheritanceChildrens(a_SchemaName NAME,a_TableName NAME,a_Mode VARCHAR(10)) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_InheritanceChildrens (a_SchemaName VARCHAR(256),a_TableName VARCHAR(256),a_TableName NAME,a_Mode VARCHAR(10)); /************************************************************************/ /*       */ /************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_InheritanceChildrens (a_SchemaName VARCHAR(256) default 'public',/*     */ a_TableName VARCHAR(256) default NULL,/*   */ a_Mode VARCHAR(10) default 'estimate' /*     */ ) RETURNS TABLE (rs_TableName VARCHAR(256),rs_TableDescription TEXT, rs_NumberOfAttribute INTEGER,rs_NumberOfChecks INTEGER, rs_hasPKey BOOLEAN,rs_hasIndex BOOLEAN, rs_hasSubClass BOOLEAN,rs_NumberOfRow INTEGER) AS $BODY$ DECLARE c_TableKind CONSTANT CHAR:='r'; BEGIN RETURN QUERY SELECT tic.rs_TableName::VARCHAR(256),tic.rs_TableDescription::TEXT, tic.rs_NumberOfAttribute::INTEGER,tic.rs_NumberOfChecks::INTEGER, tic.rs_hasPKey::BOOLEAN,tic.rs_hasIndex::BOOLEAN, tic.rs_hasSubClass::BOOLEAN,tic.rs_NumberOfRow::INTEGER FROM admtf_Table_InheritanceChildrens(a_SchemaName::NAME, a_TableName::NAME,a_Mode::VARCHAR(10)) tic; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_InheritanceChildrens(a_SchemaName VARCHAR(256),a_TableName VARCHAR(256),a_Mode VARCHAR(10)) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Table_InheritanceChildrens('public'::NAME,'np_house'::NAME); SELECT * FROM admtf_Table_InheritanceChildrens('public'::VARCHAR(256),'np_house'::VARCHAR(256)); 


إنشاء وظيفة admtf_Attribute_PKFeatures


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Attribute_PKFeatures (a_TableOID OID,a_AttributeNo SMALLINT); /***************************************************************************/ /*        . */ /*   ,          */ /*   */ /***************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Attribute_PKFeatures (a_TableOID OID, /*   */ a_AttributeNo SMALLINT /*     */ ) RETURNS TABLE (rs_isAttributePK BOOLEAN,rs_PKeyName name,rs_ColumnPKNo SMALLINT) AS $BODY$ DECLARE C_PKAttributeList_NDims CONSTANT INTEGER:=1; /*     */ v_PKAttributeList SMALLINT[]; /*       */ v_PKAttributeIndx INTEGER; /*      */ v_PKAttributeLBound INTEGER; /*      */ v_PKAttributeUBound INTEGER; /*      */ --********************************************************************** BEGIN rs_isAttributePK:=false; rs_ColumnPKNo:=NULL; SELECT INTO rs_PKeyName,v_PKAttributeList,rs_isAttributePK conname,conkey,ARRAY[a_AttributeNo]<@conkey FROM pg_constraint c WHERE c.contype='p' and c.conrelid=a_TableOID; IF FOUND AND rs_isAttributePK THEN --      v_PKAttributeLBound:=array_lower(v_PKAttributeList,C_PKAttributeList_NDims); v_PKAttributeUBound:=array_upper(v_PKAttributeList,C_PKAttributeList_NDims); v_PKAttributeIndx:=v_PKAttributeLBound; WHILE v_PKAttributeIndx <= v_PKAttributeUBound AND a_AttributeNo<>v_PKAttributeList[v_PKAttributeIndx] LOOP v_PKAttributeIndx:=v_PKAttributeIndx+1; END LOOP; IF v_PKAttributeIndx<=v_PKAttributeUBound THEN rs_ColumnPKNo:=v_PKAttributeIndx; END IF; END IF; RETURN QUERY SELECT rs_isAttributePK,rs_PKeyName,rs_ColumnPKNo; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Attribute_PKFeatures(a_TableOID OID,a_AttributeNo SMALLINT) IS '              '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Attribute_PKFeatures((SELECT OID FROM pg_class WHERE relname='street'),3::SMALLINT); 


إنشاء وظيفة admtf_Attribute_FKFeatures


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Attribute_FKFeatures (a_TableOID OID,a_AttributeNo SMALLINT); /****************************************************************************/ /*        . */ /*   ,         */ /*   . */ /****************************************************************************/ /****************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Attribute_FKFeatures (a_TableOID OID, /*   */ a_AttributeNo SMALLINT /*     */ ) RETURNS TABLE (rs_isAttributeFK BOOLEAN,rs_FKeyName name[],rs_ColumnFKNo SMALLINT[],rs_FKTableName name[],rs_FKTableColumnName name[]) AS $BODY$ DECLARE C_FKAttributeList_NDims CONSTANT INTEGER:=1; /*     */ v_FKAttributeList SMALLINT[]; /*       */ v_RefAttributeList SMALLINT[]; /*     , */ /*     */ v_FKAttributeIndx INTEGER; /*      */ v_RefAttributeListIndx INTEGER; /*     , */ /*     */ v_FKAttributeLBound INTEGER; /*      */ v_FKAttributeUBound INTEGER; /*      */ v_FKConstraintIndx INTEGER; /*     */ v_FKeyName name; /*   , */ /*     */ v_FKTableName name; /*  ,     */ v_FKTableColumnName name; /*    , */ /*     */ v_RefAttributeNo SMALLINT; /*     , */ /*     */ v_Constraint pg_constraint%ROWTYPE; /*     */ /*  (CONSTRANT) */ --****************************************************************************************************** BEGIN rs_isAttributeFK:=false; rs_ColumnFKNo:=NULL; v_FKConstraintIndx:=0; FOR v_Constraint IN SELECT * FROM pg_constraint c WHERE c.contype='f' and c.conrelid=a_TableOID AND ARRAY[a_AttributeNo]<@conkey ORDER BY c.oid LOOP v_FKConstraintIndx:=v_FKConstraintIndx+1; rs_isAttributeFK:=true; v_FKeyName:=v_Constraint.conname; v_FKAttributeList:=v_Constraint.conkey; v_RefAttributeList:=v_Constraint.confkey; v_FKAttributeLBound:=array_lower(v_FKAttributeList,C_FKAttributeList_NDims); v_FKAttributeUBound:=array_upper(v_FKAttributeList,C_FKAttributeList_NDims); v_FKAttributeIndx:=v_FKAttributeLBound; WHILE v_FKAttributeIndx <= v_FKAttributeUBound AND a_AttributeNo<>v_FKAttributeList[v_FKAttributeIndx] LOOP v_FKAttributeIndx:=v_FKAttributeIndx+1; END LOOP; rs_FKeyName[v_FKConstraintIndx]:=v_FKeyName; rs_ColumnFKNo[v_FKConstraintIndx]:=v_FKAttributeIndx; SELECT INTO v_FKTableName ftbl.relname FROM pg_class ftbl WHERE ftbl.oid=v_Constraint.confrelid; rs_FKTableName[v_FKConstraintIndx]:=v_FKTableName; v_RefAttributeNo:=v_RefAttributeList[v_FKAttributeIndx]; v_FKTableColumnName:=NULL; SELECT INTO v_FKTableColumnName attname FROM pg_attribute a WHERE a.attrelid=v_Constraint.confrelid AND a.attnum=v_RefAttributeNo; rs_FKTableColumnName[v_FKConstraintIndx]:=v_FKTableColumnName; END LOOP; RETURN QUERY SELECT rs_isAttributeFK,rs_FKeyName,rs_ColumnFKNo, rs_FKTableName,rs_FKTableColumnName; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Attribute_FKFeatures(a_TableOID OID,a_AttributeNo SMALLINT) IS '              '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Attribute_FKFeatures((SELECT OID FROM pg_class WHERE relname='street'),4::SMALLINT); 



إنشاء وظيفة admtf_Attribute_Features


يمكن العثور على التعليقات على رمز مصدر الوظيفة هنا.
رمز الوظيفة
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Attribute_Features (a_TableOID OID,a_AttributeNo SMALLINT); /****************************************************************************/ /*      */ /****************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Attribute_Features (a_TableOID OID, /*   */ a_AttributeNo SMALLINT/*     */ ) RETURNS TABLE (rsa_AttributeName name,rsa_UserTypeName VARCHAR(256),rsa_TypeName VARCHAR(256),rsa_isNotNULL BOOLEAN,rsa_isAttributePK BOOLEAN, rsa_ColumnPKNo SMALLINT,rsa_Description Text,rsa_isAttributeFK BOOLEAN,rsa_FKeyName name[],rsa_ColumnFKNo SMALLINT[],rsa_FKTableName name[],rsa_FKTableColumnName name[]) AS $BODY$ DECLARE v_Return_Error Integer := 0; /*  */ --********************************************************************* BEGIN SELECT INTO rsa_AttributeName,rsa_UserTypeName,rsa_TypeName, rsa_isNotNULL,rsa_Description attr.attname, CASE WHEN COALESCE(typ.typbasetype,0)>0 THEN typ.typname::VARCHAR(100) ELSE ''END AS r_UserTypeName, FORMAT_TYPE(COALESCE(NULLIF(typ.typbasetype,0),typ.oid), COALESCE(NULLIF(typ.typtypmod,-1),attr.atttypmod))::VARCHAR(256) AS r_TypeName, attr.attnotnull AS r_isNotNULL, dsc.description AS r_Description FROM pg_attribute attr LEFT OUTER JOIN pg_type typ ON attr.atttypid=typ.oid LEFT OUTER JOIN pg_type btyp ON typ.typbasetype=btyp.oid LEFT OUTER JOIN pg_description dsc ON dsc.objoid=attr.attrelid AND dsc.objsubid=attr.attnum WHERE attr.attrelid =a_TableOID AND attr.attnum=a_AttributeNo; SELECT INTO rsa_isAttributePK,rsa_ColumnPKNo rs_isAttributePK,rs_ColumnPKNo FROM admtf_Attribute_PKFeatures(a_TableOID,a_AttributeNo); SELECT INTO rsa_isAttributeFK,rsa_FKeyName,rsa_ColumnFKNo,rsa_FKTableName, rsa_FKTableColumnName rs_isAttributeFK,rs_FKeyName, rs_ColumnFKNo,rs_FKTableName,rs_FKTableColumnName FROM admtf_Attribute_FKFeatures(a_TableOID,a_AttributeNo); RETURN QUERY SELECT rsa_AttributeName,rsa_UserTypeName,rsa_TypeName,rsa_isNotNULL, rsa_isAttributePK,rsa_ColumnPKNo,rsa_Description,rsa_isAttributeFK, rsa_FKeyName,rsa_ColumnFKNo,rsa_FKTableName,rsa_FKTableColumnName; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Attribute_Features(a_TableOID OID,a_AttributeNo SMALLINT) IS '   '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Attribute_Features ((SELECT OID FROM pg_class WHERE relname='street'),2::SMALLINT); 


انظر أيضًا


وظائف لتوثيق قواعد بيانات PostgreSQL. جزء واحد .
وظائف لتوثيق قواعد بيانات PostgreSQL. الجزء الثاني .
وظائف لتوثيق قواعد بيانات PostgreSQL. النهاية (الجزء الرابع) .

Source: https://habr.com/ru/post/ar418597/


All Articles