2013/8/20 David E. Wheeler <da...@justatheory.com> > On Aug 20, 2013, at 2:31 PM, Pavel Stehule <pavel.steh...@gmail.com> > wrote: > > > but it works > > > > postgres=# do $$begin with x as (select 10) insert into omega select * > from x; end;$$; > > DO > > But this does not: > > david=# DO $$ > david$# BEGIN > david$# PERFORM * FROM ( > david$# WITH inserted AS ( > david$# INSERT INTO foo values (1) RETURNING id > david$# ) SELECT inserted.id > david$# ) x; > david$# END; > david$# $$; > ERROR: WITH clause containing a data-modifying statement must be at the > top level > LINE 2: WITH inserted AS ( > ^ > QUERY: SELECT * FROM ( > WITH inserted AS ( > INSERT INTO foo values (1) RETURNING id > ) SELECT inserted.id > ) x > CONTEXT: PL/pgSQL function inline_code_block line 3 at PERFORM > > yes, in this context you should not use a PERFORM
PL/pgSQL protect you before useless queries - so you can use a CTE without returned result directly or CTE with result via PERFORM statement (and in this case it must be unmodifing CTE). Sorry, I don't see any problem - why you return some from CTE and then you throw this result? > Best, > > David > >