2013/8/28 Robert Haas <robertmh...@gmail.com> > On Tue, Aug 27, 2013 at 6:10 PM, Pavel Stehule <pavel.steh...@gmail.com> > wrote: > > what is magical? > > > > Stored procedures - we talk about this technology was a originally simple > > script moved from client side to server side. > > > > so if I write on client side > > > > BEGIN; > > SELECT 1,2; > > SELECT 2; > > SELECT 3,4; > > END; > > > > then I expect results > > > > 1,2 > > 2 > > 3,4 > > The biggest problem with this idea is that people will do it by > accident with unacceptable frequency. During the decade or so I > worked as a web programmer, I made this mistake a number of times, and > judging by the comments on this thread, Josh Berkus has made it with > some regularity as well. If experienced PostgreSQL hackers who know > the system inside and out make such mistakes with some regularity, I > think we can anticipate that novices will make them even more often. > > And, TBH, as others have said here, I find the requirement to use > PERFORM rather than SELECT rather ridiculous. The clash with CTEs has > been there since we added CTEs, and I've hit it more than once. Yeah, > you can work around it, but it's annoying. And why annoy people? So > +1 from me for de-requiring the use of PERFORM (though I think we > should definitely continue to accept that syntax, for backward > compatibility). > > At the end of the day, procedural languages in PostgreSQL are > pluggable. So if we someday have the ability to return extra result > sets on the fly, and if Pavel doesn't like the syntax we choose to use > in PL/pgsql, he can (and, given previous history, very possibly will!) > publish his own PL with different syntax. But I'm with the crowd that > says that's not the right decision for PL/pgsql. >
I cannot to say what is good design for PL/pgSQL - only I feel so some variant of RETURN statement is not good, because semantic is significantly different. And I see a increasing inconsistency between a original ADA and PL/pgSQL. Sure, When I am thinking about PSM, I am thinking about T-SQL syntax, but there is little bit simpler situation - there is a precedent in PSM implementation in MySQL and some other new databases. > > Also, even if we did adopt Pavel's proposed meaning for "SELECT 1,2", > we still have a problem to solve, which is what the user should write > when they want to run a query and ignore the results. The PERFORM > solution was adequate at a time when all select queries started with > SELECT, but now they can start with WITH or VALUES or TABLE as well, > and while VALUES and TABLE may be ignorable, WITH certainly isn't. > Requiring people to use silly workarounds like selecting into an > otherwise-pointless dummy variable is not cool. If we reserve the > undecorated-SELECT syntax to mean something else, then we've got to > come up with some other way of solving David's original problem, and I > don't think there are going to be many elegant options. > > Finally, I'd like to note that it's been longstanding frustration of > mine that the PERFORM->SELECT transformation is leaky. For example, > consider: > > rhaas=# do $$begin perform amazingly_well(); end;$$; > ERROR: function amazingly_well() does not exist > LINE 1: SELECT amazingly_well() > I am thinking, so we are near a merit of problem - if I understand well, a PERFORM was originally designed instead a CALL statement. Due implementation it was used for some other SQL calls too. Origin PL/SQL doesn't allow SELECT without INTO. your example is good and important, because almost all described issues are related to unsuccessfully solved or a missing procedures. so main problem is a impossibility to write BEGIN CALL fce() or BEGIN fce(); A workaround in Postgres is PERFORM - and I really has nothing again to remove PERFORM for start of VOID functions! A unhelpful error message has zero relevant to topic - just almost all in PL/pgSQL is SELECT. Do you would to remove a ":=" statement too? postgres=# do $$declare x int; begin x := notexisting(10); end; $$ ; ERROR: function notexisting(integer) does not exist LINE 1: SELECT notexisting(10) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. QUERY: SELECT notexisting(10) CONTEXT: PL/pgSQL function inline_code_block line 1 at assignment Time: 148.760 ms Regards Pavel - > Robert Haas > EnterpriseDB: http://www.enterprisedb.com > The Enterprise PostgreSQL Company >