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

Plpgsql में दी गई तालिका के आधार पर वापसी पंक्ति प्रकारों को गतिशील रूप से परिभाषित करें?

यदि "किसी ज्ञात तालिका पर आधारित" से आपका तात्पर्य "बिल्कुल किसी ज्ञात तालिका की तरह" से है, तो हां

SQL एक कड़ाई से टाइप की जाने वाली भाषा है और कार्यों को एक अच्छी तरह से परिभाषित रिटर्न प्रकार के साथ बनाया जाना चाहिए। आप गुमनाम रिकॉर्ड पर वापस जा सकते हैं जैसा आपने स्पष्ट रूप से किया था (RETURNS SETOF record . के साथ) ), लेकिन फिर आपको प्रत्येक कॉल के लिए एक कॉलम परिभाषा सूची जोड़नी होगी, जैसे त्रुटि संदेश आपको बताता है। कुछ इस तरह:

SELECT *
FROM   my_function('foo') AS foo (
          colum_name1 integer  -- name and data type for every column
        , colum_name2 text
        , colum_name3 real);

और यह शायद ही गतिशील है।

आपका प्रश्न व्याख्या के लिए जगह छोड़ता है, लेकिन "एक ज्ञात तालिका पर आधारित" इंगित करेगा कि एक बहुरूपी कार्य चाल चल सकती है। वापसी प्रकार गतिशील रूप से किसी भी पंजीकृत पंक्ति प्रकार पर आधारित हो सकता है, और सिस्टम में प्रत्येक तालिका के लिए स्वचालित रूप से एक होता है। बेयरबोन कोड उदाहरण:

CREATE OR REPLACE FUNCTION my_function(_rowtype anyelement)
  RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format(
     'SELECT * FROM %s LIMIT 10'
    , pg_typeof(_rowtype)  -- pg_typeof() returns regtype, quoted where necessary
      );
END
$func$ LANGUAGE plpgsql;

कॉल करें:

SELECT * FROM my_function(NULL::my_table);

इस संबंधित उत्तर में विस्तृत निर्देश (अंतिम अध्याय देखें "विभिन्न पूर्ण तालिका प्रकार" ):




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. हेरोकू रेल 4 सर्वर से कनेक्ट नहीं हो सका:कनेक्शन अस्वीकृत

  2. गैर अद्वितीय टाइमस्टैम्प पर समय विभाजन के साथ TimescaleDB हाइपरटेबल कैसे बनाएं?

  3. शामिल टेबल पर सीक्वेलाइज़ कंडीशन लिमिट कंडीशन के साथ काम नहीं करती है

  4. जब स्थिति (पुरानी) हो तो ट्रिगर डालें या अपडेट करें

  5. हेरोकू समीक्षा ऐप्स:ऐप की समीक्षा करने के लिए डीबी की प्रतिलिपि बनाएँ