Re: Weird Trigger Behaviour using IF ... THEN ... ESLEIF... - Mailing list pgsql-sql

From Stephan Szabo
Subject Re: Weird Trigger Behaviour using IF ... THEN ... ESLEIF...
Date
Msg-id 20050905212707.Y5782@megazone.bigpanda.com
Whole thread Raw
In response to Weird Trigger Behaviour using IF ... THEN ... ESLEIF... THEN... ELSEIF... THEN ... ELSE ... END IF;  ("Antony Sohal" <ASohal@voxgen.com>)
List pgsql-sql
On Mon, 5 Sep 2005, Antony Sohal wrote:

> Please can you help me with the following trigger I have written in
> PostgreSQL 7.4.8 running under Fedora Linux, using pgAdmin III as
> client.

> Now I create a trigger on event table as :
>
> CREATE OR REPLACE FUNCTION fn_event()
>   RETURNS "trigger" AS
> '
>   DECLARE
>     -- Declare a variable to hold the event id.
>     eventid       INTEGER;
>     logme         VARCHAR;
>     eventvalue_id INTEGER;
>     delimiter     VARCHAR DEFAULT \'|\';
>     -- Declare a variable to key and value.
>     eventkey      VARCHAR;
>     eventvalue    VARCHAR;
>
>   BEGIN
>     eventid := NEW.event_id;
>     logme := substring(NEW.log_statement FROM position(delimiter IN
> NEW.log_statement)+1 FOR length(NEW.log_statement));
>
>     WHILE length(logme) > 0 AND position(delimiter IN logme) > 0 LOOP
>  BEGIN
>   eventkey := substring(logme FROM 0 FOR position(delimiter IN logme));
>   logme := substring(logme FROM (position(delimiter IN logme)+1) FOR
> length(logme));
>
>   IF position(delimiter IN logme) = 0 THEN
>       BEGIN
>    eventvalue := logme;
>       END;
>   ELSE
>       BEGIN
>    eventvalue := substring(logme FROM 0 FOR position(delimiter IN
> logme));
>       END;
>   END IF;
>   logme := substring(logme FROM position(delimiter IN logme) + 1 FOR
> length(logme));
>   SELECT INTO eventvalue_id nextval(\'event_sequence\');
>   EXECUTE \'INSERT INTO event_value (event_value_id, event_id,
> event_key, event_value) VALUES (\' ||
>      eventvalue_id || \',\' || eventid || \',\' ||
> quote_literal(eventkey) || \',\' || quote_literal(eventvalue) || \')\';
>  END;
>      END LOOP;
>      RETURN NULL;
>  END;
>  '
>   LANGUAGE 'plpgsql' VOLATILE;
>
>
> CREATE TRIGGER tg_event AFTER INSERT ON event
>   FOR EACH ROW EXECUTE PROCEDURE fn_event();
>
> Then I create a trigger on event_value:
>
> CREATE OR REPLACE FUNCTION fn_event_value() RETURNS TRIGGER AS '
> DECLARE
>     -- Declare a variable to key and value.
>     id          INTEGER;
> BEGIN
>     EXECUTE \'INSERT INTO strings_tbl VALUES ( \' ||
> quote_literal(NEW.event_key) || \')\';
>     IF \'APPLICATION\' = NEW.event_key THEN
>         EXECUTE \'INSERT INTO strings_tbl VALUES ( \' ||
> quote_literal(NEW.event_value) || \')\';
>         RETURN NULL;
>     END IF;
>     IF \'CLI\' = NEW.event_key THEN
>         EXECUTE \'INSERT INTO strings_tbl VALUES ( \' ||
> quote_literal(NEW.event_value) || \')\';
>         RETURN NULL;
>     END IF;
>
>     -- do nothing, nothing at all...
>     EXECUTE \'INSERT INTO strings_tbl VALUES ( \' ||
> quote_literal(\'EMPTY\') || \')\';
>
>     RETURN NULL;
> END;
> ' LANGUAGE plpgsql;

I don't see the ELSEIF in either of the above.

> Now if I change the trigger with this I get the excepted result:
>
> CREATE OR REPLACE FUNCTION fn_event_value() RETURNS TRIGGER AS '
> DECLARE
>     -- Declare a variable to key and value.
>     id          INTEGER;
> BEGIN
>     EXECUTE \'INSERT INTO strings_tbl VALUES ( \' ||
> quote_literal(NEW.event_key) || \')\';
>     IF \'APPLICATION\' = NEW.event_key THEN
>  EXECUTE \'INSERT INTO strings_tbl VALUES ( \' ||
> quote_literal(NEW.event_value) || \')\';
>         RETURN NULL;
>     END IF;
>     IF \'CLI\' = NEW.event_key THEN
>         EXECUTE \'INSERT INTO strings_tbl VALUES ( \' ||
> quote_literal(NEW.event_value) || \')\';
>         RETURN NULL;
>     END IF;
>
>     -- do nothing, nothing at all...
>     EXECUTE \'INSERT INTO strings_tbl VALUES ( \' ||
> quote_literal(\'EMPTY\') || \')\';
>
>     RETURN NULL;
> END;
> ' LANGUAGE plpgsql;
>

>

> However, please can some one explain why IF .... THEN .... ELSEIF .....
> THEN .... ELSEIF .... THEN.... ELSE .... END IF; doesn't work.

IIRC Until 8.0 the correct spelling is ELSIF. I believe 8.0 added ELSEIF
as an alternate spelling.


pgsql-sql by date:

Previous
From: "Dinesh Pandey"
Date:
Subject: Re: Table Constraint CHECK(SELECT()) alternative?
Next
From: Stephan Szabo
Date:
Subject: Re: ERROR: syntax error at or near "select" at character 9