Re: plpgsql question: select into multiple variables ? - Mailing list pgsql-general

From Day, David
Subject Re: plpgsql question: select into multiple variables ?
Date
Msg-id 401084E5E73F4241A44F3C9E6FD7942801183DBD93@exch-01
Whole thread Raw
In response to plpgsql question: select into multiple variables ?  ("Day, David" <dday@redcom.com>)
List pgsql-general

Hi Yari,

 

Thanks for the response.

You did make the “simplified concept” function more rational.


However,

This was kind of a non-sense function to demonstrate the problem I was having with the “select fields” and the “into variables”.

As pointed out by Adrian Klaver and  Tom Lane,  the real problem was in casts that I was using were confusing the parser and were un-necessary.

 

Appreciate your thought and effort.

 

 

Regards

 

 

Dave

 

 

 

From: Yasin Sari [mailto:yasinsari81@googlemail.com]
Sent: Tuesday, June 30, 2015 3:26 AM
To: Day, David
Subject: Re: [GENERAL] plpgsql question: select into multiple variables ?

 

Hi David,

 

this works for me.

 

CREATE OR REPLACE FUNCTION sys.time_test (

  out first_weekend date,

  out last_weekend date

)

RETURNS SETOF record AS

$body$

BEGIN

 

 

  SELECT COALESCE(MIN(CAL_DATE),'01-jun-2014'),COALESCE(MAX(CAL_DATE),'01-jun-2014')

  into first_weekend,last_weekend

  FROM sys.calendar

WHERE month_of_year = (extract(MONTH FROM current_date))::int AND
              year_of_date = (extract(YEAR FROM current_date))::int AND

             day_of_week IN ( 'Sat','Sun');

return next;

 

END

$body$

LANGUAGE 'plpgsql'

VOLATILE

CALLED ON NULL INPUT

SECURITY INVOKER

COST 100 ROWS 1000;

 

On Mon, Jun 29, 2015 at 10:07 PM, Day, David <dday@redcom.com> wrote:

Hi,



Postgres version 9.3.9


What is wrong with my usage of the plpgsql  "select into" concept
I have a function to look into a calendar table to find the first and
Last weekend date of a month.

In this simplified concept function I end up with a NULL for first or last weekend variable.


create or replace function sys.time_test ()
returns date as
$$
DECLARE
   first_weekend date;
   last_weekend date;
BEGIN

  SELECT MIN(CAL_DATE),MAX(CAL_DATE) INTO first_weekend::date, last_weekend::date FROM sys.calendar
          WHERE month_of_year = (extract(MONTH FROM current_date))::int AND
              year_of_date = (extract(YEAR FROM current_date))::int AND
             day_of_week IN ( 'Sat','Sun');

 RETURN( COALESCE(last_weekend,'01-jun-2014'));

END
$$
LANGUAGE plpgsql volatile;


If I execute the same select logic from a psql shell I get the correct result.


(1 row)

ace_db=# ace_db=#  SELECT MIN(CAL_DATE),MAX(CAL_DATE) FROM sys.calendar cal                                                                                                                             WHERE cal.month_of_year = (extract(MONTH FROM current_date))::int AND                                                                                                      cal.year_of_date = (extract(YEAR FROM current_date))::int AND                                                                                                        cal.day_of_week IN ( 'Sat','Sun');
    min     |    max
------------+------------
 2015-06-06 | 2015-06-28
(1 row)


If I simplify to a single variable it works. i.e


create or replace function sys.time_test ()
returns date as
$$
DECLARE
   first_weekend date;
   last_weekend date;
BEGIN

  SELECT MIN(CAL_DATE) INTO first_weekend::date FROM sys.calendar
          WHERE month_of_year = (extract(MONTH FROM current_date))::int AND
              year_of_date = (extract(YEAR FROM current_date))::int AND
             day_of_week IN ( 'Sat','Sun');

 RETURN( COALESCE(first_weekend,'01-jun-2014'));

END
$$
LANGUAGE plpgsql volatile;



I suppose I can adjust to write my actual function to have 2 selects; one for each variable.
However, I thought according to the documentation the targets could/must match the result columns for select into ?


Thoughts


Thanks


Dave Day




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

 

pgsql-general by date:

Previous
From: Bráulio Bhavamitra
Date:
Subject: Re: Feature request: fsync and commit_delay options per database
Next
From: Leonard Boyce
Date:
Subject: Hardware question