Re: problem w/plpgsql proc - Mailing list pgsql-sql

From Aasmund Midttun Godal
Subject Re: problem w/plpgsql proc
Date
Msg-id 20011015160611.24133.qmail@ns.krot.org
Whole thread Raw
In response to problem w/plpgsql proc  (leo <lmendoza@garbersoft.net>)
List pgsql-sql
I may be wrong, but I believe you should not have a semicolon after beginning a loop (in the for clause) and the IF NOT
EXISTSclause should be different: you are probably wanting FOUND which  is a special variable so you will have to do
theselect first and then check the FOUND variable afterwards. You are also trying to use FOUND as a normal variable,
whichI suspect will fail because it is a reserved word.
 

Regards,

Aasmund.


On Fri, 12 Oct 2001 11:05:45 -0500, leo <lmendoza@garbersoft.net> wrote:
> Hi all - 
>  This might be the wrong forum for this, but I don't want to cross-post 
> unless someone tells me I should.
> 
> Anyways, I'm having a problem trying to compile this plpg proc. I'll post 
> the proc and the errors. I'm coming from a T-SQL background, so hopefully 
> when I get the hang of Pl/PgSQL I'll be able to draft up a doc for porting 
> from T-SQL to Pl/PgSQL.
> 
> proc:
> /**
>  *editEmail: all vars required 
>   - will renumber the sequence if needed
>   - if the email address is not found, it will add it.
>         returns:
>                 -1 - the user already has 8 entries
>                 0  - the record was updated, and the table renumbered
>                 1  - the record was added.
>  **/
> 
> --DROP FUNCTION editEmail(integer, smallint, varchar, varchar);
> 
> CREATE FUNCTION editEmail(integer, smallint, varchar, varchar) RETURNS 
> integer AS '
> DECLARE
>         ufk ALIAS FOR $1;
>         seq ALIAS FOR $2;
>         em  ALIAS FOR $3;
>         emp ALIAS FOR $4;
> 
>  --for renumbering the records
>  rec RECORD;
>  cnt INTEGER;
>  found SMALLINT := 0;
> BEGIN
>  -- see if the email address exists, then see if renumbering is needed
>  CREATE TEMP TABLE this_user AS
>                 SELECT * FROM tblemailadd WHERE emuserfk = ufk;
> 
>  GET DIAGNOSTICS cnt = ROW_COUNT; --equiv. to @@ROWCOUNT
> 
>  -- see if the user exists in the table, then see if the user already
>  -- has 8 entries. If so - return -1 (error)... max 8 entries allowed :)
>  IF (cnt > 7) THEN
>         IF NOT EXISTS (SELECT emseqnum FROM this_user WHERE emailaddr = em; ) THEN
>                 RETURN -1;
>         END IF;
>  END IF;
> 
>  --see if renumbering is needed..
>  IF (cnt > 1) THEN
>                         FOR rec IN SELECT * FROM this_user LOOP;
>                                 --renumber the sequences
>                                 UPDATE tblemailadd SET
>                                         emseqnum = rec.emseqnum + 1
>                                 WHERE emuserfk = ufk AND emailaddr = rec.emailaddr;
> 
>                                 IF (em = rec.emailaddr) THEN
>                                         found = 1; -- looks like we found the email addr.
>                                 END IF;
>                         END LOOP;
> 
>                         -- if the emailaddr was found, then update the record.
>                         -- if it wasn't, then insert the new record.
>                         IF (found = 1) THEN
>                                 UPDATE tblemailadd SET
>                                  emseqnum = seq, emailaddr = em, emprettyname = emp
> 121 >>>                         WHERE emuserfk = ufk;
>                                 RETURN 0;
>                         ELSE
>                                 INSERT tblemailadd (emuserfk, emseqnum, emailaddr, emprettyname)
>                                 VALUES (ufk, seq, em, emp);
>                                 RETURN 1;
>                         END IF;
> 
>  ELSE
>                 IF (cnt > 7) THEN
>                  RETURN -1; --alas! the user has too many records to proceed!
>                 END IF
> 
>                 --make sure that the sequencing order begins intact
>                 IF (cnt = 1 AND seq = 1) THEN
>                  seq := 2;
>                 ELSE
>                         IF (cnt = 0 AND seq != 1) THEN
>                                 seq := 1
>                         END IF;
>                 END IF;
> 
>                 INSERT tblemailadd (emuserfk, emseqnum, emailaddr, emprettyname)
>                 VALUES (ufk, seq, em, emp);
> 
>                 RETURN 1; --huzahh! the record has been added!
>  END IF;
> END;
> 'LANGUAGE 'plpgsql';
> 
> errors:
> psql:edit_procs.sql:121: ERROR:  parser: parse error at or near "t"
> psql:edit_procs.sql:122: ERROR:  parser: parse error at or near "return"
> psql:edit_procs.sql:125: ERROR:  parser: parse error at or near "ELSE"
> psql:edit_procs.sql:126: ERROR:  parser: parse error at or near "return"
> psql:edit_procs.sql:127: ERROR:  parser: parse error at or near "if"
> psql:edit_procs.sql:131: ERROR:  parser: parse error at or near "ELSE"
> psql:edit_procs.sql:136: ERROR:  parser: parse error at or near "if"
> psql:edit_procs.sql:140: ERROR:  parser: parse error at or near "ELSE"
> psql:edit_procs.sql:141: ERROR:  parser: parse error at or near "if"
> psql:edit_procs.sql:144: ERROR:  parser: parse error at or near 
> "tblemailadd"
> psql:edit_procs.sql:146: ERROR:  parser: parse error at or near "return"
> psql:edit_procs.sql:147: ERROR:  parser: parse error at or near "if"
> psql:edit_procs.sql:148: NOTICE:  COMMIT: no transaction in progress
> COMMIT
> 
> this is part of a larger script, but the function declaration before this 
> works perfectly, so I assume the problem lies here.
> 
> sorry for the length...
> TIA
> leo
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
> 
> http://www.postgresql.org/users-lounge/docs/faq.html

Aasmund Midttun Godal

aasmund@godal.com - http://www.godal.com/
+47 40 45 20 46


pgsql-sql by date:

Previous
From: Tom Lane
Date:
Subject: Re: Restricting access to Large objects
Next
From: "Josh Berkus"
Date:
Subject: Re: Cenceptual help needed - periodic events