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

PostgreSQL में फ़ंक्शन से गतिशील तालिका बनाएं

आपका समाधान एक व्यवहार्य तरीका है। मैं बड़े पैमाने पर आपके plpgsql फ़ंक्शन को सरलीकरण/प्रदर्शन/पठनीयता/सुरक्षा के लिए फिर से लिखता हूं।

CREATE OR REPLACE FUNCTION f_taxamount()
 RETURNS void AS
$BODY$
DECLARE
    rec record;
BEGIN

    DROP TABLE IF EXISTS tmptable;

    EXECUTE 'CREATE TABLE tmptable (invoiceid integer PRIMARY KEY, '
        || (
           SELECT string_agg(col || ' numeric(9,2) DEFAULT 0', ', ')
           FROM  (
              SELECT quote_ident(lower(replace(taxname,' ','_'))) AS col
              FROM   tbltaxamount
              GROUP  BY 1
              ORDER  BY 1
              ) x
           )
        || ')';

    EXECUTE '
        INSERT INTO tmptable (invoiceid)
        SELECT DISTINCT invoiceid FROM tbltaxamount';

    FOR rec IN
        SELECT taxname, taxamt, invoiceid FROM tbltaxamount ORDER BY invoiceid
    LOOP
        EXECUTE '
            UPDATE tmptable
            SET ' || quote_ident(lower(replace(rec.taxname,' ','_')))
                  || ' = '|| rec.taxamt || ' 
            WHERE invoiceid = ' || rec.invoiceid;
    END LOOP;

END;
$BODY$ LANGUAGE plpgsql;

यह PostgreSQL 9.1 या बाद के संस्करण के लिए काम करता है।

पीजी 8.4 . के लिए या बाद में बदलें

SELECT string_agg(col || ' numeric(9,2) DEFAULT 0', ', ')

साथ:

SELECT array_to_string(array_agg(col || ' numeric(9,2) DEFAULT 0'), ', ')

संस्करणों के लिए और भी पुराने इसके अलावा इस तरह एक समग्र कार्य बनाएँ:

CREATE OR REPLACE FUNCTION f_concat_comma(text, text)
  RETURNS text AS
$BODY$
BEGIN
RETURN ($1 || ', '::text) || $2;
END;
$BODY$
  LANGUAGE plpgsql IMMUTABLE;

CREATE AGGREGATE concat_comma(text) (
  SFUNC=f_concat_comma,
  STYPE=text
);

और फिर लिखें:

SELECT concat_comma(col || ' numeric(9,2) DEFAULT 0')

इसके अलावा:

DROP TABLE IF EXISTS tmptable;

खंड "IF EXISTS" को संस्करण 8.2 . के साथ पेश किया गया था .
यदि आपको और भी पुराने संस्करण का उपयोग करना चाहिए इससे आपको यह करना चाहिए:

IF EXISTS (
    SELECT *
    FROM   pg_catalog.pg_class
    WHERE  oid = 'tmptable'::regclass
    AND    relkind = 'r')
THEN
    DROP TABLE tmptable;
END IF;
*/

अपग्रेड करें!

PostgreSQL प्रोजेक्ट की वर्ज़निंग नीति पर एक नज़र डालें . संस्करण 8.0.1 एक विशेष रूप से छोटी गाड़ी संस्करण है। मैं दृढ़ता से अपग्रेड करने की सलाह देते हैं। यदि आप एक नए प्रमुख संस्करण में अपग्रेड नहीं कर सकते हैं, तो कम से कम सुरक्षा कारणों से नवीनतम पॉइंट-रिलीज़ में अपग्रेड करें, आपके मामले में 8.0.26। यह बिना कुछ बदले, अपनी जगह पर किया जा सकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. http://localhost/phppgadmin/ -> 403 निषिद्ध

  2. क्या मुझे लेनदेन में चयन शामिल करना चाहिए?

  3. पोस्टग्रेज में json_populate_recordset का उपयोग करके जेसन को कैसे पार्स करें?

  4. पोस्टग्रेस्क्ल में RAISE NOTICE से फ़ाइल में लिखें

  5. डॉकर वॉल्यूम का उपयोग कर डेटाबेस को कायम रखना