Unable to create a PL/PGSL function : Did I miss something ? - Mailing list pgsql-general

From Bruno BAGUETTE
Subject Unable to create a PL/PGSL function : Did I miss something ?
Date
Msg-id !~!UENERkVCMDkAAQACAAAAAAAAAAAAAAAAABgAAAAAAAAATBuXKOMvlkWzD3KJN6FWLMKAAAAQAAAAzIDhpt6AEU6g8RJIq7f9PQEAAAAA@baguette.net
Whole thread Raw
Responses Re: Unable to create a PL/PGSL function : Did I miss something ?  (Martijn van Oosterhout <kleptog@svana.org>)
List pgsql-general
Hello,

I'm trying to build a PL/PGSQL function that will be called by a trigger
which will update a table named 'mview_contacts'. That table plays the
role of a materialized view.

The 'plpgsql' language is installed on that database (there are already
several functions inside) but I don't understand why I can't store that
function in the database.

When I cut/paste the code, psql seems to wait for something at the end:

levure(> ' LANGUAGE 'plpgsql';
levure'>

I've counted 178 ' quotes in that function, so I don't think that is a
missing quote.
There are 38 opening ( and 38 closing ).
All the IF are closed by a END IF.

Do you see what I've missed to get that function to be saved inside the
database ?



CREATE OR REPLACE function update_mview_contacts() RETURN OPAQUE AS '
    BEGIN
        IF TG_OP = ''INSERT'' THEN
            -- Add the new contact into the materialized
view

            IF TG_RELNAME = ''people'' THEN
                EXECUTE ''INSERT INTO mview_contacts
(pk_fk_cnt_id,cnt_name,cnt_type,cnt_initial)'' ||
quote_literal('VALUES(NEW.pk_fk_cnt_id, (COALESCE(NEW.l_name,\'\') || \'
\' || COALESCE(NEW.f_name,\'\')),
\'people\',LOWER(SUBSTR((COALESCE(NEW.l_name,\'\') || \' \' ||
COALESCE(NEW.f_name,\'\')), 1, 1)))');
            ELSIF TG_RELNAME = ''organizations'' THEN
                EXECUTE ''INSERT INTO mview_contacts
(pk_fk_cnt_id,cnt_name,cnt_type,cnt_initial)'' ||
quote_literal('VALUES(NEW.pk_fk_cnt_id, NEW.org_name,
\'organization\',LOWER(SUBSTR(NEW.org_name, 1, 1)))');
            ELSE
                RAISE EXCEPTION ''The [%] table is
unsupported by this trigger function'', TG_RELNAME;
            END IF;
        ELSIF TG_OP = ''UPDATE'' THEN
            -- Update the contact infos in the materialized
view

            IF TG_RELNAME = ''people'' THEN
                EXECUTE ''UPDATE mview_contacts SET ''
                || quote_ident('cnt_name') || '' = '' ||
quote_literal('(COALESCE(l_name,\'\') || \' \' ||
COALESCE(f_name,\'\'))') || '',''
                || quote_ident('cnt_type') || '' = '' ||
quote_literal('people') || '',''
                || quote_ident('cnt_initial') || '' = ''
|| quote_literal('LOWER(SUBSTR(NEW.org_name, 1, 1))')
                || '' WHERE mview_contacts.pk_fk_cnt_id
= '' || quote_literal(OLD.pk_fk_cnt_id);
            ELSIF TG_RELNAME = ''organizations'' THEN
                EXECUTE ''UPDATE mview_contacts SET ''
                || quote_ident('cnt_name') || '' = '' ||
quote_literal('NEW.org_name') || '',''
                || quote_ident('cnt_type') || '' = '' ||
quote_literal('organization') || '',''
                || quote_ident('cnt_initial') || '' = ''
|| quote_literal('LOWER(SUBSTR(NEW.org_name, 1, 1))')
                || '' WHERE mview_contacts.pk_fk_cnt_id
= '' || quote_literal(OLD.pk_fk_cnt_id);
            ELSE
                RAISE EXCEPTION ''The [%] table is
unsupported by this trigger function'', TG_RELNAME;
            END IF;
        ELSIF TG_OP = ''DELETE'' THEN
            -- Remove the contact from the materialized view

            IF TG_RELNAME = ''people'' THEN
                EXECUTE ''DELETE mview_contacts WHERE
pk_fk_cnt_id = OLD.pk_fk_cnt_id'';
            ELSIF TG_RELNAME = ''organizations'' THEN
                EXECUTE ''DELETE mview_contacts WHERE
pk_fk_cnt_id = OLD.pk_fk_cnt_id'';
            ELSE
                RAISE EXCEPTION ''The [%] table is
unsupported by this trigger function'', TG_RELNAME;
            END IF;
        ELSE
            -- Unknown trigger operation
            -- ==> Raise an exception
            RAISE EXCEPTION ''Unknown trigger function
operation [%]'', TG_OP;
        END IF;
    END;
' LANGUAGE 'plpgsql';


Thanks you very much in advance for your help.

Regards,

---------------------------------------
Bruno BAGUETTE - pgsql-ml@baguette.net


pgsql-general by date:

Previous
From: Joe Conway
Date:
Subject: Re: dblink: rollback transaction
Next
From: Martijn van Oosterhout
Date:
Subject: Re: Unable to create a PL/PGSL function : Did I miss something ?