Обсуждение: Return rows from function with expressions

Поиск
Список
Период
Сортировка

Return rows from function with expressions

От
novnov
Дата:
I've written many stored procedures in ms sql and a good many functions in
postgres, but I'm rather unsure of how to get a list back from a postgres
function which is not based on a table. Example from sql server:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[procPatient]
    @PatStatusID int = 0
AS
BEGIN
    SELECT PatID, PatFName + ' ' + PatLName as pname  FROM tblPatient WHERE
PatStatusID = @PatStatusID
END

Output from the sproc above is like
PatID  pname
123    Merton Baffled
129    Jim Puzzled

I've spent a good deal of time reading here and in the pg docs about
functions that use SETOF. I can't find a plain and simple way to do
something like the above. Is there? I simply need to pass in some params,
and do some evals inside the function and return a set that includes some
cols that are not part of the base table. I've seen solutions that involve
OUT params; a method which uses RECORD that requires the columns to be
defined in the call; refcursors (which I don't really understand); are those
the only options? A simple example like the one I've used for sql server
above would be ideal.
--
View this message in context: http://www.nabble.com/Return-rows-from-function-with-expressions-tf3812759.html#a10792602
Sent from the PostgreSQL - general mailing list archive at Nabble.com.


Re: Return rows from function with expressions

От
Ragnar
Дата:
On fim, 2007-05-24 at 13:59 -0700, novnov wrote:
> I've written many stored procedures in ms sql and a good many functions in
> postgres, but I'm rather unsure of how to get a list back from a postgres
> function which is not based on a table. Example from sql server:
>
> set ANSI_NULLS ON
> set QUOTED_IDENTIFIER ON
> GO
> ALTER PROCEDURE [dbo].[procPatient]
>     @PatStatusID int = 0
> AS
> BEGIN
>     SELECT PatID, PatFName + ' ' + PatLName as pname  FROM tblPatient WHERE
> PatStatusID = @PatStatusID
> END
>
> Output from the sproc above is like
> PatID  pname
> 123    Merton Baffled
> 129    Jim Puzzled

test=# create table pats (patid int, patfname text, patlname text,
patstatus int);
CREATE TABLE

test=# insert into pats values (123,'Merton','Baffled',2);
INSERT 0 1
test=# insert into pats values (129,'Jim','Puzzled',2);
INSERT 0 1
test=# insert into pats values (132,'Joe','Confused',1);
INSERT 0 1

test=# create type patrec as (patid int, patname text);
CREATE TYPE

test=# create or replace function getpats(int) returns setof patrec as
$$ select patid,patfname|| ' ' || patlname from pats where patstatus=$1
$$ language SQL;
CREATE FUNCTION

test=# select * from getpats(2);
 patid |    patname
-------+----------------
   123 | Merton Baffled
   129 | Jim Puzzled
(2 rows)

hope this helps
gnari