Thread: functions with plpgsql

functions with plpgsql

From
"Bernd Hoffmann"
Date:
Hi,

I have some problems by using functions with plpgsql.

For example:

tbl:

CREATE TABLE "logs" (
   "id" int4 DEFAULT nextval('"logs_id_seq"'::text) NOT NULL,
   "session" varchar NOT NULL,
   "addr" inet NOT NULL,
   "host" varchar NOT NULL,
   "agent" varchar NOT NULL,
   "datum" timestamptz DEFAULT now(),
   "referer" varchar,
   CONSTRAINT "logs_pkey" PRIMARY KEY ("id")
);

function:

CREATE FUNCTION "next_id"(character varying) RETURNS integer AS '
DECLARE
    tabelle ALIAS FOR $1;
BEGIN
    SELECT MAX(id)+1 FROM tabelle;
END;
' LANGUAGE 'plpgsql'

query:

SELECT next_id(logs);

error:

PostgreSQL meldet: ERROR: parser: parse error at or near "$1"

Can anybody help me?

MfG

Bernd Hoffmann


unixserver.info
96123 Litzendorf
Tel: +499505/8050485
Fax: +499505/8050486
info@unixserver.info


Re: functions with plpgsql

From
"Andrew J. Kopciuch"
Date:
> CREATE FUNCTION "next_id"(character varying) RETURNS integer AS '
> DECLARE
>     tabelle ALIAS FOR $1;
> BEGIN
>     SELECT MAX(id)+1 FROM tabelle;
> END;
> ' LANGUAGE 'plpgsql'
>
> query:
>
> SELECT next_id(logs);
>
> error:
>
> PostgreSQL meldet: ERROR: parser: parse error at or near "$1"
>
> Can anybody help me?


I do not think you can evaluate a declared vairable as a table name in the
SELECT statement.

I don't think you really need to do this though.  If you have the table name
already.

why go:

SELECT next_id(logs);

And write this functios instead of:

SELECT MAX(id) + 1 FROM logs;


??


Andy

Re: functions with plpgsql

From
"Bernd Hoffmann"
Date:
Hallo Andy,

> I do not think you can evaluate a declared vairable as a table name in the
> SELECT statement.

where can I find some docu about declare a table by variable.

> I don't think you really need to do this though.  If you have the table
name
> already.
> why go:
> SELECT next_id(logs);
> SELECT MAX(id) + 1 FROM logs;

it's only a example, I got everytime the error:

PostgreSQL meldet: ERROR: parser: parse error at or near "$1"

PS.: Excuse me, for my bad english :)

MfG

Bernd



Re: functions with plpgsql

From
Brad Bulger
Date:

Bernd Hoffmann wrote:

> Hallo Andy,
>
>
>>I do not think you can evaluate a declared vairable as a table name in the
>>SELECT statement.
>
>
> where can I find some docu about declare a table by variable.

you need to do this as a dynamic query.

look in the pl/pgsql docs here
http://www.postgresql.org/docs/7.3/interactive/plpgsql-statements.html
and here
http://www.postgresql.org/docs/7.3/interactive/plpgsql-control-structures.html
for description of the FOR-IN-EXECUTE loop you need for dynamic SELECTs

basically it'll be something like

FOR myrecordvar IN EXECUTE ''select max(id) from '' ||
quote_ident(mytablenamevar) LOOP
    ... do some stuff ...
END LOOP;