> Greetings.
>
> I have a DBI (DBD::Pg) application I'm building in mod_perl. My
> queries tend to look something like the following.
>
> my $sql = q(SELECT departure_date, eq.name AS equipment,
> dp.full_city AS departure_city, ap.full_city AS arrival_city,
> ca.name AS carrier_name, number
> FROM jsjourneys
> FULL OUTER JOIN jscarriers AS ca ON jsjourneys.carrier = ca.id
> FULL OUTER JOIN jsequipment AS eq ON jsjourneys.equipment = eq.id
> JOIN jsports AS dp ON jsjourneys.departure_port = dp.id
> JOIN jsports AS ap ON jsjourneys.arrival_port = ap.id
> ORDER BY departure_date);
>
> And, then, I execute them as follows.
>
> $dbh->selectall_arrayref($sql, { Slice => {} });
>
> Which works quite well.
>
> However, I'm concerned about $sql because when I output it to
Apache's
> debug log, it looks like this:
>
> [Fri Jan 11 03:49:09 2008] [debug] Log.pm(36): [client
192.168.171.80]
> [JetSet] SELECT departure_date, eq.name AS equipment,\n dp.full_city
> AS departure_city, ap.full_city AS arrival_city,\n ca.name AS
> carrier_name, number\n FROM jsjourneys\n FULL OUTER JOIN
> jscarriers AS ca ON jsjourneys.carrier = ca.id\n FULL OUTER JOIN
> jsequipment AS eq ON jsjourneys.equipment = eq.id\n JOIN jsports
> AS dp ON jsjourneys.departure_port = dp.id\n JOIN jsports AS ap
> ON jsjourneys.arrival_port = ap.id\n ORDER BY departure_date
>
> Notice the newline characters in there. If those were really in the
> query, I can't imagine the database would run it, so I suppose
they're
> an artifact of the combination of using q() to quote my query and
> using Apache's logger to output it.
>
> All this leads up to a pretty simple question: is using q() to quote
> my queries a bad thing, and/or will it cause trouble in the future?
>
> (As an aside, how do you guys quote your queries? I find that for
> anything longer than about 60 characters, q() and '' and everything
> else start to look horribly inelegant.)
I've tried several different ways, global variables, local variables, modules
but, FWIW, I've found putting long scripts in a subroutine works pretty well
from a maintenance standpoint: (This is from an older report. Now I encourage
the poor guy who has to maintain my stuff to use ? instead of %s whenever
practical)
sub some_descriptive_script_name {
return qq{
select 'ZIP' as "Type", a.zipresultcode "Result Code", e.errordesc
"Description", count(*) "Total"
from psn_cbarlog a, certmas c, psn_erroralertmas e
where a.certno=c.certno
and e.errorcode = a.zipresultcode
and c.certcrtdate >= to_date('%s','MM-DD-YYYY')
and c.certcrtdate < to_date('%s','MM-DD-YYYY')
and c.certmode = 'P' %s
and c.tranid in (1,2,3,91,99)
group by a.zipresultcode, e.errordesc
union
select 'History' as "Type", a.historyresultcode "Result Code", e.errordesc
"Description", count(*) "Total"
from psn_cbarlog a, certmas c, psn_erroralertmas e
where a.certno=c.certno
and e.errorcode = a.historyresultcode
and c.certcrtdate >= to_date('%s','MM-DD-YYYY')
and c.certcrtdate < to_date('%s','MM-DD-YYYY')
and c.certmode = 'P' %s
and c.tranid in (1,2,3,91,99)
group by a.historyresultcode, e.errordesc
union
select 'GIS' as "Type", a.gisresultcode "Result Code", e.errordesc
"Description", count(*) "Total"
from psn_cbarlog a, certmas c, psn_erroralertmas e
where a.certno=c.certno
and e.errorcode = a.gisresultcode
and c.certcrtdate >= to_date('%s','MM-DD-YYYY')
and c.certcrtdate < to_date('%s','MM-DD-YYYY')
and c.certmode = 'P' %s
and c.tranid in (1,2,3,91,99)
group by a.gisresultcode, e.errordesc
};
}
I cluster all the subroutines together at the end of the program.
In webreports I also include the SQL in the generated HTML as a comment.
--
Stephen Carville <[EMAIL PROTECTED]>
Systems Engineer
Land America
1.626.667.1450 X1326
#####################################################################
Dulce et decorum est pro patria mori.
Si alius est effectus is.