मेरे पास एक समान स्थिति थी - विस्तृत पैरामीटर सूची के साथ कार्य। तथाकथित नामित पैरामीटर . के साथ , आपको पैरामीटर के क्रम का सम्मान करने की आवश्यकता नहीं है। कोड लंबा है, लेकिन (मुझे आशा है) अधिक पठनीय और अधिक मजबूत।
CREATE TABLE tab(name text, surname text, address text, city text, zip text);
CREATE OR REPLACE FUNCTION public.fx(name text, surname text,
address text, city text, zip text)
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
INSERT INTO tab(name, surname, address, city, zip)
VALUES(fx.name, fx.surname, fx.address, fx.city, fx.zip);
-- ... some other logic
END;
$function$
इस फ़ंक्शन को नामित पैरामीटर . के साथ बुलाया जा सकता है संकेतन:
SELECT fx(name := 'Pavel', surname := 'Stehule',
address := 'Skalice 12', city := 'Benesov', zip := '12');
ध्यान दें:जब मैं गलत प्रकार का उपयोग करता हूं - रिपोर्ट संदेश पोस्ट करता है:
postgres=# SELECT fx(name := 'Pavel', surname := 'Stehule', address := 'Skalice 12', city := 'Benesov', zip := 12); ERROR: function fx(name := unknown, surname := unknown, address := unknown, city := unknown, zip := integer) does not exist LINE 1: SELECT fx(name := 'Pavel', surname := 'Stehule', ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
संदेश मान्य है, लेकिन यह साफ नहीं है। यह फ़ंक्शन ओवरलोडिंग समर्थन की लागत है। एक और तरकीब है, लंबी पैरामीटर सूची को कैसे विभाजित किया जाए, और इन मुद्दों को और अधिक आराम से कैसे खोजा जाए।
पोस्टग्रेज कस्टम प्रकारों का समर्थन करते हैं। आप इसका इस्तेमाल कर सकते हैं:
CREATE TYPE person_type AS (name text, surname text);
CREATE TYPE address_type AS (address text, city text, zip text);
आप एक कंस्ट्रक्टर फंक्शन लिख सकते हैं:
CREATE OR REPLACE FUNCTION public._person_type(name text, surname text)
RETURNS person_type
LANGUAGE plpgsql
AS $function$
DECLARE r person_type;
BEGIN
r.name = name;
r.surname = surname;
RETURN r;
END;
$function$
CREATE OR REPLACE FUNCTION public._address_type(address text, city text, zip text)
RETURNS address_type
LANGUAGE plpgsql
AS $function$ DECLARE r address_type;
BEGIN
r.address = address;
r.city = city;
r.zip = zip;
RETURN r;
END;
$function$
इस प्रणाली को बनाने के लिए कुछ काम करने की जरूरत है और यह केवल लंबे समय तक चलने वाले सिस्टम के लिए व्यावहारिक है। दूसरी ओर, यह भविष्य के रखरखाव के काम की लागत को कम करता है।
CREATE OR REPLACE FUNCTION public.fx(p person_type, a address_type)
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
INSERT INTO tab(name, surname, address, city, zip)
VALUES(p.name, p.surname, a.address, a.city, a.zip);
-- ... some other logic
END;
$function$
अब, अधिक नोटेशन (नोटेशन का संयोजन) संभव है:
postgres=# SELECT fx(_person_type('Pavel','Stehule'),
postgres(# _address_type('Skalice 12','Benesov', '25601'));
fx
----
(1 row)
कंस्ट्रक्टर त्रुटि स्थानीयकरण में मदद करते हैं:
postgres=# SELECT fx(_person_type('Pavel','Stehule'), _address_type('Skalice 12','Benesov', 25601)); ERROR: function _address_type(unknown, unknown, integer) does not exist LINE 2: _address_type('Skalice 12','Benesov', 25601)); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.