Well not really much DBI can do for you.  You usually start from scratch trying 
to write SQL that is not Driver Specific though that can be hard.

you are usually stuck with something like this

sub edit_sql {
    my ($self, $sql) = @_;​
​
    if ($self->isPostgres) {​
        return InformixToPgsSQL::modify($sql);​
    } else {​
        return PgsToInformixSQL::modify($sql);​
    }​
}​
​
sub prepare {​
    my ($this, $sql) = @_;​
​
    $sql = $this->edit_sql($sql);​
​
    if (0 && exists $this->{'cursors'}->{$sql} && $sql !~ /ref_cron_exec/si) {​
        return ($this->{'cursors'}->{$sql});​
    }​
    else {​
        my $start = Time::HiRes::time;​
        my $qry;​
        eval { $qry = $this->{'dbh'}->prepare($sql); };​
        if ($qry) {​
            $this->{'cursors'}->{$sql} = $qry;​
            $this->{'stmts'}->{$qry}   = $sql;​
            $this->report("Prepared", $sql, [], $start, Time::HiRes::time)​
                if $$this{'monitor'};​
        }​
        else {​
            my $err = "<no dbh>";​
            eval { $err = $this->{'dbh'}->errstr(); };​
            $this->log($err, $sql);​
        }​
        return ($qry);​
    }​
}​

where in this case I have a Module that does the 'prepare' and there I check 
the SQL and make the required changes

the 'InformixToPgsSQL' and 'PgsToInformixSQL' just use regex to swap out any 
SQL that is not compatible like

this
 if ($sql =~ /\btoday\b/i) {
      $sql =~ s/\btoday\b/ current_date /gi;​
   }​

today vs current_date

One way around this situation is to write custom functions on the RDBMS side to 
mimic the functionality ie a 'current_date' function to mimic 'today'


Many here will say start afresh and use an ORM like DBIx::Class or 
Fey::ORM<http://search.cpan.org/dist/Fey-ORM>  or alike

Cheers
________________________________
From: Mike Martin <redt...@gmail.com>
Sent: February 8, 2019 5:37 PM
To: dbi-users@perl.org
Subject: Translate between DBI and SQL

Has anyone done any work on converting SQL queries between RDBMS and perl?

My particular interest is DBD::Pg but anything would be of use

It would be very useful when I am testing complex SQL, it's very easy to miss a 
\ or quote between the two

Thanks
Mike

Reply via email to