Adding a metaClosure to execute seems the easiest change. I created
GROOVY-11342 to track here:

https://issues.apache.org/jira/browse/GROOVY-11342

Would the expectation be that the metaClosure is called for each
result producing a ResultSet?

Paul.

On Sat, Mar 23, 2024 at 3:40 AM <steve.etchel...@gmail.com> wrote:
>
> Thanks Jörg,
>
> Yes, that's one of the approaches I tried but the execute() method doesn't 
> appear to provide metadata (column names, types, etc) and my application 
> needs that information.
>
> That's why my request was to either
>
>   - add the "hasResults" argument to the rows() and eachRow() methods
>
> OR
>
>   - add metadata results to the execute() method.
>
> The relevant variants that I'm seeing are:
>
>     eachRow(String sql, Closure metaClosure, Closure rowClosure)
>     eachRow(GString gstring, Closure metaClosure, Closure rowClosure)
>
>     rows(String sql, Closure metaClosure)
>     rows(GString gstring, Closure metaClosure)
>
>     execute(String sql, Closure processResults)
>     execute(GString gstring, Closure processResults)
>
> where for the eachRow() and rows() methods -
>
>     sql - the sql statement
>     metaClosure - called for metadata (only once after sql execution)
>     rowClosure - called for each row with a GroovyResultSet
>
> and for the execute() method -
>
>     sql - the SQL to execute
>     processResults - a Closure which will be passed two parameters: either 
> true plus a list of GroovyRowResult values derived from 
> statement.getResultSet() or false plus the update count from 
> statement.getUpdateCount(). The closure will be called for each result 
> produced from executing the SQL.
>
> The processResults() closure that execute() calls is passed two parameters, 
> while the rowClosure() closure that eachRow() and rows() calls only appears 
> to pass the one parameter, the GroovyResultSet.
>
> My enhancement request is to align these three method "families" (eachRow, 
> rows, and execute) so that they all have a variant with a metaClosure and/or 
> a two-parameter processResults closure.
>
> Thanks,
> Steve
>
> -----Original Message-----
> From: Jörg Prante <joergpra...@gmail.com>
> Sent: Friday, March 22, 2024 12:03 PM
> To: users@groovy.apache.org
> Subject: Re: SQL enhancement request
>
> Hi Steve,
>
> just use this Sql.execute method
>
> https://docs.groovy-lang.org/latest/html/api/groovy/sql/Sql.html#execute(java.lang.String,groovy.lang.Closure)
>
> to send arbitrary statements and decide by the isResultSet flag in the 
> closure whether you have to obtain a result set from a select query, or an 
> update counter or something from a non-result set query (update, insert, 
> delete).
>
> There is a short example in the documentation.
>
> Best regards,
>
> Jörg
>
> Am Donnerstag, dem 21.03.2024 um 14:18 -0500 schrieb
> steve.etchel...@gmail.com:
> > Groovy team,
> >
> > It is my understanding (which can always be improved!) that Groovy SQL
> > supports about 3 “families” of interaction methods – execute() and its
> > variants, rows() and eachRow() for submitting SQL statements and
> > processing any results generated.
> >
> > Each of them has a variety of signatures and they are for the most
> > part really “groovy” and a pleasure to work with.  I really like
> > Groovy and don’t understand why it hasn’t taken the world by storm
> > given its super compatibility with Java.  😊
> >
> > However, I’ve run across one area that I feel like could benefit from
> > a change/enhancement in the Groovy Sql package.  The execute() methods
> > accept a closure to process the results that come back from the
> > database/driver and that closure accepts two arguments – the first
> > argument specifies whether or not the result set has any results and
> > then the second argument processes any results.  It is that first
> > argument that does not seem to be consistently available in the other
> > methods.  For example, if you were to use the rows() method and the
> > SQL statement was say in INSERT statement then you’ll get an exception
> > stating that the request does not produce a resultSet and there does
> > not appear to be any way to work around it.
> >
> > Of course I could switch from the rows() method to the execute()
> > method but then I (appear) to lose the metadata results (column names,
> > types, etc).
> >
> > My situation is that I do not know in advance what SQL statements are
> > going to be processed, they come from user input.  And I need the
> > metadata information – for those statements that generate results.  I
> > thought maybe I could just use the rows() method and catch any
> > exceptions for statements that do not generate results and then
> > resubmit those statements via execute() but that approach is pretty
> > ugly and seems to generate error messages that are
> > difficult/impossible to suppress.
> >
> > If the other SQL methods supported the “hasResults” flag and/or if the
> > execute() methods supported metadata results I feel like the overall
> > implementation would be improved.
> >
> > Thanks,
> > Steve
> >
> >
>
>

Reply via email to