Returning RECORD from PGSQL without custom type?

Started by D. Dante Lorensoalmost 18 years ago6 messagesgeneral
Jump to latest
#1D. Dante Lorenso
dante@larkspark.com

Instead of doing this:

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint)
RETURNS SETOF record AS
$body$
...
$body$
LANGUAGE 'plpgsql' VOLATILE;

I'd like to be able to do this:

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint)
RETURNS SETOF (col1name BIGINT, col2name TEXT, ...) AS
$body$
...
$body$
LANGUAGE 'plpgsql' VOLATILE;

Because this is the only function that will be returning that TYPE and I
don't want to have to create a separate type definition just for the
return results of this function.

Maybe even more cool would be if the OUT record was already defined so
that I could simply select into that record to send our new rows:

RETURN NEXT OUT;

OUT.col1name := 12345;
RETURN NEXT OUT;

SELECT 12345, 'sample'
INTO OUT.col1name, OUT.col2name;
RETURN NEXT OUT;

Just as you've allowed me to define the IN variable names without
needing the legacy 'ALIAS $1 ...' format, I'd like to name the returned
record column names and types in a simple declaration like I show above.

Does this feature request make sense to everyone? It would make
programming set returning record functions a lot easier.

-- Dante

#2Pavel Stehule
pavel.stehule@gmail.com
In reply to: D. Dante Lorenso (#1)
Re: Returning RECORD from PGSQL without custom type?

Hello

2008/5/10 D. Dante Lorenso <dante@larkspark.com>:

Instead of doing this:

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint)
RETURNS SETOF record AS
$body$
...
$body$
LANGUAGE 'plpgsql' VOLATILE;

I'd like to be able to do this:

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint)
RETURNS SETOF (col1name BIGINT, col2name TEXT, ...) AS
$body$
...
$body$
LANGUAGE 'plpgsql' VOLATILE;

Standard syntax via ANSI SQL is
CREATE FUNCTION foo(params)
RETURNS TABLE(fields of output table) AS
$$ ...

$$

Because this is the only function that will be returning that TYPE and I
don't want to have to create a separate type definition just for the return
results of this function.

Maybe even more cool would be if the OUT record was already defined so that
I could simply select into that record to send our new rows:

RETURN NEXT OUT;

OUT.col1name := 12345;
RETURN NEXT OUT;

SELECT 12345, 'sample'
INTO OUT.col1name, OUT.col2name;
RETURN NEXT OUT;

it's good idea - it was probably main problem of last patch in
plpgsql. In this syntax is clear what is output, so RETURN NEXT
statement can be without params. I am only not sure about name of
default variable - maybe result is better.

Regards
Pavel Stehule

Show quoted text

Just as you've allowed me to define the IN variable names without needing
the legacy 'ALIAS $1 ...' format, I'd like to name the returned record
column names and types in a simple declaration like I show above.

Does this feature request make sense to everyone? It would make programming
set returning record functions a lot easier.

-- Dante

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#3D. Dante Lorenso
dante@lorenso.com
In reply to: Pavel Stehule (#2)
Re: Returning RECORD from PGSQL without custom type?

Pavel Stehule wrote:

Hello
2008/5/10 D. Dante Lorenso <dante@larkspark.com>:

Instead of doing this:

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint)
RETURNS SETOF record AS
$body$
...
$body$
LANGUAGE 'plpgsql' VOLATILE;

I'd like to be able to do this:

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint)
RETURNS SETOF (col1name BIGINT, col2name TEXT, ...) AS
$body$
...
$body$
LANGUAGE 'plpgsql' VOLATILE;

Standard syntax via ANSI SQL is
CREATE FUNCTION foo(params)
RETURNS TABLE(fields of output table) AS
$$ ...
$$

Ah, this sound almost exactly like what I'm wanting! So ... you are
saying that developers are working on something like? I'm running 8.3
... would I find this feature in 8.4 or is it still not included in any
release?

Because this is the only function that will be returning that TYPE and I
don't want to have to create a separate type definition just for the return
results of this function.

Maybe even more cool would be if the OUT record was already defined so that
I could simply select into that record to send our new rows:
RETURN NEXT OUT;
OUT.col1name := 12345;
RETURN NEXT OUT;
SELECT 12345, 'sample'
INTO OUT.col1name, OUT.col2name;
RETURN NEXT OUT;

it's good idea - it was probably main problem of last patch in
plpgsql. In this syntax is clear what is output, so RETURN NEXT
statement can be without params. I am only not sure about name of
default variable - maybe result is better.

Yeah, RESULT works too. I'm not particular about what it has to be ...
just that something like that might exist.

Where can I go to follow development of this or test it out? I see some
old threads now that I know what to look for:

http://archives.postgresql.org/pgsql-hackers/2007-02/msg00318.php
http://archives.postgresql.org/pgsql-patches/2007-02/msg00216.php
http://archives.postgresql.org/pgsql-patches/2007-02/msg00341.php
http://archives.postgresql.org/pgsql-hackers/2007-09/msg01079.php

I want to make sure this patch/proposal covers my needs and
expectations. Specifically I want to return records that are not simple
a straight query:

CREATE OR REPLACE FUNCTION foo(f integer)
RETURNS TABLE(a int, b int) AS
$$
DECLARE
my_a INT;
my_b INT;
BEGIN
-- 1) perhaps like this
SELECT 1, 2
INTO RESULT.a, RESULT.b;
RETURN NEXT RESULT;

-- 2) maybe like this
RETURN NEXT 3, 4; -- a=3, b=4

-- 3) how about like this
my_a := 5;
my_b := 6;
RETURN NEXT my_a, my_b;

-- 4) maybe like this
RETURN NEXT QUERY SELECT a, b FROM sometable x WHERE x.f = f;

-- done
RETURN;
END;
$$ LANGUAGE plpgsql;

Usage:

SELECT a, b
FROM foo(20);

Results:

a | b
---+----
1 | 2 <-- 1)
3 | 4 <-- 2)
5 | 6 <-- 3)
... <-- 4) results from sometable WHERE x.f = 20

What do you think, will I be able to do all of this?

-- Dante

Show quoted text

Regards
Pavel Stehule

Just as you've allowed me to define the IN variable names without needing
the legacy 'ALIAS $1 ...' format, I'd like to name the returned record
column names and types in a simple declaration like I show above.

Does this feature request make sense to everyone? It would make programming
set returning record functions a lot easier.

-- Dante

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: D. Dante Lorenso (#3)
Re: Returning RECORD from PGSQL without custom type?

"D. Dante Lorenso" <dante@lorenso.com> writes:

I'd like to be able to do this:

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint)
RETURNS SETOF (col1name BIGINT, col2name TEXT, ...) AS

You realize of course that you can do this *today* if you use OUT
parameters?

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint,
OUT col1name BIGINT, OUT col2name TEXT, ...)
RETURNS SETOF RECORD AS

The TABLE syntax is a bit more standards-compliant maybe, but it's not
offering any actual new functionality.

regards, tom lane

#5Pavel Stehule
pavel.stehule@gmail.com
In reply to: Tom Lane (#4)
Re: Returning RECORD from PGSQL without custom type?

2008/5/12 Tom Lane <tgl@sss.pgh.pa.us>:

"D. Dante Lorenso" <dante@lorenso.com> writes:

I'd like to be able to do this:

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint)
RETURNS SETOF (col1name BIGINT, col2name TEXT, ...) AS

You realize of course that you can do this *today* if you use OUT
parameters?

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint,
OUT col1name BIGINT, OUT col2name TEXT, ...)
RETURNS SETOF RECORD AS

The TABLE syntax is a bit more standards-compliant maybe, but it's not
offering any actual new functionality.

it should minimalize columns and variables collision (for beginer
users).There isn't new functionality, but it can be more accessible
for new users. What I know, current syntax is for some people curios .

Regars
Pavel Stehule

Show quoted text

regards, tom lane

#6D. Dante Lorenso
dante@lorenso.com
In reply to: Tom Lane (#4)
Re: Returning RECORD from PGSQL without custom type?

Tom Lane wrote:

"D. Dante Lorenso" <dante@lorenso.com> writes:

I'd like to be able to do this:

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint)
RETURNS SETOF (col1name BIGINT, col2name TEXT, ...) AS

You realize of course that you can do this *today* if you use OUT
parameters?

No, I didn't realize. I always assumed OUT parameters were like return
values from a function ... like:

(out1, out2, out3) = somefunction (in1, in2, in3);

I never realized you could return a SETOF those OUT parameters. I guess
it wasn't intuitive, but I'm learning this now.

I think all the functionality I want DOES already exist. Let me go work
with it. Thanks.

-- Dante

Show quoted text

CREATE OR REPLACE FUNCTION "my_custom_func" (in_value bigint,
OUT col1name BIGINT, OUT col2name TEXT, ...)
RETURNS SETOF RECORD AS

The TABLE syntax is a bit more standards-compliant maybe, but it's not
offering any actual new functionality.

regards, tom lane