Search Postgresql Archives

Re: PERFORM not working properly, please help..

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I suppose some workaround would be to introduce temporary cursor: 

CREATE OR REPLACE FUNCTION A3() RETURNS VOID AS $BODY$
declare _tmp record;
begin
  select * from A1() as dummy ( x double precision ) into _tmp;
end;
$BODY$ LANGUAGE 'plpgsql';

But I'm not sure if this is more effiecent than A3 returning the set. Thanks for replies!
 
"Pavel Stehule" <pavel.stehule@xxxxxxxxx> napisał(a): 
 > 2010/2/19  <wilczarz1@xxxxx>:
 > > Hi Pavel, thanks for reply. Your solution:
 > >
 > > CREATE OR REPLACE FUNCTION A3() RETURNS VOID AS $BODY$
 > > begin
 > >  return query select * from A1();
 > >  return;
 > > end;
 > > $BODY$ LANGUAGE 'plpgsql';
 > >
 > > generates error "cannot use RETURN QUERY in a non-SETOF function" because A3 returns VOID.
 > 
 > problem is in A3, cannot be void.
 > 
 > PostgreSQL has only function. It hasn't "procedures" where you can
 > execute unbinded queries. So if you can take any result from any
 > rutine, you have to take it explicitly. VOID in pg means, there are no
 > any interesting result, really no any interesting result. It can be
 > problem, when you know MySQL procedures or MSSQL procedures. You have
 > to forgot on procedures with returning recordset or multirecordset as
 > secondary effect.
 > 
 > regards
 > Pavel Stehule
 > 
 > >
 > >
 > > "Pavel Stehule" <pavel.stehule@xxxxxxxxx> napisał(a):
 > >  > Hello
 > >  >
 > >  > 2010/2/18  <wilczarz1@xxxxx>:
 > >  > > I have a function A1 that returns setof records, and I use it in two ways:
 > >  > > 1) from function A2, where I need results from A1
 > >  > > 2) from function A3, where I don't need these results, all I need is to
 > >  > > execute logic from A1
 > >  > >
 > >  > > Here ale very simple versions of my functions:
 > >  > >
 > >  > > CREATE OR REPLACE FUNCTION A1() RETURNS setof record AS $BODY$
 > >  > > begin
 > >  > > � -- some logic here
 > >  > > � return query select col from tab;
 > >  > > end;
 > >  > > $BODY$ LANGUAGE 'plpgsql';
 > >  > >
 > >  > > CREATE OR REPLACE FUNCTION A2() RETURNS setof record AS $BODY$
 > >  > > begin
 > >  > > � -- some logic here
 > >  > > � return query select * from A1() as dummy ( x double precision);
 > >  > > end;
 > >  > > $BODY$ LANGUAGE 'plpgsql';
 > >  > >
 > >  > > CREATE OR REPLACE FUNCTION A3() RETURNS VOID AS $BODY$
 > >  > > begin
 > >  > > � perform A1();
 > >  > > end;
 > >  > > $BODY$ LANGUAGE 'plpgsql';
 > >  > >
 > >  > > And here are my function calls:
 > >  > > select * from A1() as(x double precision) --ok
 > >  > > select * from A2() as(x double precision) --ok
 > >  > > select * from A3(); --not ok, argh!
 > >  > >
 > >  >
 > >  > it is correct. Every function has own stack for result. There are not
 > >  > some global stack. Perform just run function and doesn't copy inner
 > >  > result's stack to outer result stack.
 > >  >
 > >  > your A3 function have to be
 > >  > begin
 > >  >   return query select * from a1
 > >  >   return;
 > >  > end;
 > >  >
 > >  > like a2 function
 > >  >
 > >  > regards
 > >  > Pavel Stehule
 > >  > > The last one generates error "set-valued function called in context that
 > >  > > cannot accept a set". Why doesn't PERFORM work here? Thanks for help..
 > >  > >
 > >
 > >


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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]

  Powered by Linux