Thread: Postgres 11 procedures and result sets

Postgres 11 procedures and result sets

From
Jan Kohnert
Date:
Hello List,

I have a question regarding the new stored procedures in Postgres 11 (I tested 
beta4):

I'd like to know if it is somehow possible to get a (or possibly more) result 
set from selects within the SP, as it is possible in MariaDB, MySQL, or SQL 
Server. 

What I found until now is to use inout-Parms. Then I have to define all 
columns in the select as inout-Params, but then I get only one line back, 
regardless how many lines >0 have been selected.

I could also define an inout refcursor param, and parse that one, but that 
would make the new SP identical to the well known functions returning a 
refcursor. And when I use that approach, I have an additional step in Qt-Code 
for example, since I have to exec the SP, then parse to the refcursor result, 
exec the fetch and then parse the cursor output I'm interested in.

Did I miss something? 

Thanks in advance!

-- 
MfG Jan




Re: Postgres 11 procedures and result sets

From
Tom Lane
Date:
Jan Kohnert <nospam001-lists@jan-kohnert.de> writes:
> I have a question regarding the new stored procedures in Postgres 11 (I tested
> beta4):
> I'd like to know if it is somehow possible to get a (or possibly more) result
> set from selects within the SP, as it is possible in MariaDB, MySQL, or SQL
> Server.

Not there as of v11, other than the refcursor approach you already know
about.  We hope to have something nicer worked out for v12.  There
are a lot of compatibility issues to sort through :-(

            regards, tom lane


Re: Postgres 11 procedures and result sets

From
Merlin Moncure
Date:
On Mon, Oct 1, 2018 at 6:57 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Jan Kohnert <nospam001-lists@jan-kohnert.de> writes:
> > I have a question regarding the new stored procedures in Postgres 11 (I tested
> > beta4):
> > I'd like to know if it is somehow possible to get a (or possibly more) result
> > set from selects within the SP, as it is possible in MariaDB, MySQL, or SQL
> > Server.
>
> Not there as of v11, other than the refcursor approach you already know
> about.  We hope to have something nicer worked out for v12.  There
> are a lot of compatibility issues to sort through :-(

There are a few other ways of dealing with this.

If the data being returned isn't very large, you can stuff multiple
'datasets' into a single json.  I do this all the time today, with
functions.  Yet another tactic is to create temp tables (maybe ON
COMMIT DROP) and refer to those tables after calling the procedure.  I
would strongly consider this if the returned data was large and the
function/procedure was not called at a high rate (making system
catalog thrash in issue).  I would probably use these tactics,
especially the json style return, even after multi-result style
invocation were to drop.

merlin