pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Hubert depesz Lubaczewski <depesz@depesz.pl>
To: pgsql-sql@postgresql.org
Subject: how to return ONE single record from a function in plpgsql?
Date: Sun, 23 Feb 2003 01:14:42 +0100
Message-ID: <20030223001442.GA17740@depesz.pl> (raw)

hi
i was thinking about using something like:
CREATE type helper_login as (logged bool, username TEXT, points INT8,
first_login bool, admin bool, last_login timestamptz, can_ask_questions
bool, timeleft INTERVAL);
CREATE OR REPLACE FUNCTION login(TEXT, TEXT, INT8) RETURNS helper_login
AS '
DECLARE 
        in_username          ALIAS FOR $1;
        in_password          ALIAS FOR $2;
        in_quiz_id           ALIAS FOR $3;
        reply helper_login;
BEGIN   
        reply.logged := true;
        reply.username := in_username;
        reply.points := 0;
        reply.first_login := true;
        reply.admin := false;
        reply.last_login := now();
        reply.can_ask_questions := false;
        reply.timeleft := ''1 hour''::INTERVAL;
        RETURN reply;
END;
' LANGUAGE 'plpgsql';

but it doesn't work:
> select login('depesz','dupa','1');
WARNING:  plpgsql: ERROR during compile of login near line 15
ERROR:  return type mismatch in function returning tuple at or near
"reply"

of course the code as it is now is not very usable, but this is just a
test, on how to achieve what i'd like to.

then i tried to make it work as: select * from login(...) and returning
single row:
CREATE OR REPLACE FUNCTION login(TEXT, TEXT, INT8) RETURNS setof
helper_login AS '
DECLARE 
        in_username          ALIAS FOR $1;
        in_password          ALIAS FOR $2;
        in_quiz_id           ALIAS FOR $3;
        reply helper_login;
BEGIN   
        reply.logged := true;
        reply.username := in_username;
        reply.points := 0;
        reply.first_login := true;
        reply.admin := false;
        reply.last_login := now();
        reply.can_ask_questions := false;
        reply.timeleft := ''1 hour''::INTERVAL;
        RETURN NEXT reply;
        RETURN;
END;
' LANGUAGE 'plpgsql';
> select * from login('depesz','dupa','1');
WARNING:  plpgsql: ERROR during compile of login near line 15
ERROR:  Incorrect argument to RETURN NEXT at or near "reply"

hmm .. ok. so it has to be record "inside". let's see:
i modified definition from 
reply helper_login;
to
reply record;
this time i got:
> select * from login('depesz','dupa','1');
WARNING:  Error occurred while executing PL/pgSQL function login
WARNING:  line 7 at assignment
ERROR:  record "reply" is unassigned yet - don't know its tuple
structure

so - is there any chance to return one row which i dont get by a more or
less complicated "select" but rather in a computational way?

best regards

hubert depesz lubaczewski



-- 
hubert depesz lubaczewski                              http://www.depesz.pl/
i choose to hate people when they're not polite; bruise me; that's allright.
bananafishbones                                                    "pow wow"



view thread (4+ messages)  latest in thread

Message-ID: <20030223001442.GA17740@depesz.pl>
Permalink:  ../20030223001442.GA17740@depesz.pl/
Also on:    postgresql.org/message-id/20030223001442.GA17740@depesz.pl

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: depesz@depesz.pl
  Subject: Re: how to return ONE single record from a function in plpgsql?
  In-Reply-To: <20030223001442.GA17740@depesz.pl>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox