PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पोस्टग्रेज फ़ंक्शन बनाता है लेकिन निष्पादित नहीं करता है

मेरे पास एक समान स्थिति थी - विस्तृत पैरामीटर सूची के साथ कार्य। तथाकथित नामित पैरामीटर . के साथ , आपको पैरामीटर के क्रम का सम्मान करने की आवश्यकता नहीं है। कोड लंबा है, लेकिन (मुझे आशा है) अधिक पठनीय और अधिक मजबूत।

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 10 सेकंड में पोस्टग्रेस्क्ल क्वेरी

  2. पोस्टग्रेज कॉलम X मौजूद नहीं है

  3. सभी तालिकाओं के लिए कॉम्पैक्ट या रीनंबर आईडी, और अनुक्रमों को अधिकतम (आईडी) पर रीसेट करें?

  4. psycopg2 मैपिंग पायथन:पोस्टग्रेज के लिए डिक्ट्स की सूची:INSERT कथन के लिए समग्र प्रकार की सरणी

  5. postgresql टाइमस्टैम्प से std::chrono value