Handling LONG/LOB Data
The
DBI requires some additional
information to allow you to query back LONG/LOB (long/large object)
datatypes from a database. As we discussed earlier in the section on
the LongReadLen
and
LongTruncLen
attributes, the DBI is unable to
determine how large a buffer to allocate when fetching columns
containing LOB data. Therefore, we cannot simply issue a
SELECT
statement and expect it to work.
Selecting LOB data is straightforward and essentially identical to
selecting any other column of another datatype, with the important
exception that you should set at least the
LongReadLen
attribute value prior to preparing the statement that will return the
LOB. For example:
### We're not expecting binary data of more than 512 KB... $dbh->{LongReadLen} = 512 * 1024; ### Select the raw media data from the database $sth = $dbh->prepare( " SELECT mega.name, med.media_data FROM megaliths mega, media med WHERE mega.id = med.megaliths_id " ); $sth->execute(); while ( ($name, $data) = $sth->fetchrow_array ) { ... }
Without the all-important setting of LongReadLen
,
the
fetchrow_array()
call would likely fail when fetching the first row, because the
default value for LongReadLen
is very
small—typically 80 or less.
What happens if there’s a rogue column in the database that is
longer than LongReadLen
? How would the code in the
previous example cope? What would happen?
When the length of the fetched LOB data exceeds the value of
LongReadLen
, an error occurs
unless you have set ...
Get Programming the Perl DBI now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.