For security reasons, wouldn't you want to know what statements are
non-select _before_ you execute?

If you only care about after, how about something like this:

    $sth->execute;
    my @row = $sth->fetchrow_array;
    if (@row) { # results }
    elsif (!$sth->errstr) { # now rows }
    else { warn $sth->errstr }

You can't distinguish between selects that return no data and
non-selects.  But for your example below, it really wouldn't matter.
It seems you need to parse this stuff before.

On Wed, Sep 04, 2002 at 04:16:14PM +0200, Roger Perttu wrote:
> I store the result for later use in another query.

How do you parse the SQL to know what to do with it?

> If this is the (pseudo) input to my program:
> 
>    select ID from table1
>        select Name from table2 where PersonID = ID
>        insert into table3 values(ID, Name)

Do you scan the SQL for the values() tag and then look back at the
previous statements?  Is the indentation important?

> Then ID from query one and Name from query two will be inserted into 
> table3. Queries might be spread across different databases and nest to 
> any depth (until I run out of  connections).

How do you determine which database to query?

> Does anyone know if such a tool already exists?

The XSQL extensions to XML::Generator::DBI begin to address these
issues.  XSQL provides a means to intelligently store SQL queries and
their results as structured, XML documents.  Some people think XML is
a little heavy-handed, and it can be at times.  But you seems to need
a lot of power and flexibility, and writing your own parser would be a
big pain.  Of course, to use XSQL, you would have to eventually
rewrite your queries to get all the power it provides.  On the other
hand, it is easy to start using, and you can change queries to XSQL as
needed.

  http://xsql.sourceforge.net/

What would really be nice is a parser that can read SQL and convert it
to XSQL.  This would ease the transition considerably.  XSQL is still
under development (by me), so that and other features are in the
works.  Help is welcome.

There are still difficulties with PL/SQL anbd PgPL/SQL code, but you
could still label the code with an attribute that defines it as
having one effect or the other:

    <query type="insert">
      BEGIN ...
    </query>

dd
-- 
David Dooling

Reply via email to