On Wed, Nov 15, 2006 at 04:29:21PM +0100, Hermida, Leandro wrote:
> 
> I have a use case where I might need to turn off sth caching for
> DBD::Oracle.  When selecting BLOB, CLOB, LONG, etc data from an Oracle
> table you need to set the DBI attribute LongReadLen to be at least the
> size of the LOB you are going to select otherwise it will truncate it or
> raise and error (depending how you set LongTruncOk).  The LongReadLen
> DBI attribute exists at the dbh and sth levels.  If you are using
> prepare_cached then you must set the sth level LongReadLen attribute
> because changing the dbh LongReadLen and then calling prepare_cached
> again with the same SQL will still give you the old cached sth.
> 
> For example:
> 
> $dbh->{LongReadLen} = 10000;
> $sth = $dbh->prepare_cached('SELECT blob_col FROM table');
> ...
> $dbh->{LongReadLen} = 11000;
> $sth = $dbh->prepare_cached('SELECT blob_col FROM table');
> 
> The second $sth is still the cached sth from before, not a new one and
> therefore has a LongReadLen of 10000, not 11000.  One would need to:
> 
> $sth = $dbh->prepare_cached('SELECT blob_col FROM table', { LongReadLen => 
> 10000 });
> ...
> $sth = $dbh->prepare_cached('SELECT blob_col FROM table', { LongReadLen => 
> 11000 });

Sadly prepare (and prepare_cached) aren't defined to accept handle
attributes in the '%attr parameter - an historical accident.

> The question is, does DBIx::Class allow you to set sth attributes??

DBD::Oracle needs a patch to be able to modify LongReadLen for an sth.

Meanwhile, when you change $dbh->{LongReadLen} you could iterate over
 %{ $dbh->{CachedKids} } and delete any sth that might be affected.

Tim [skimming].

_______________________________________________
List: http://lists.rawmode.org/cgi-bin/mailman/listinfo/dbix-class
Wiki: http://dbix-class.shadowcatsystems.co.uk/
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/
Searchable Archive: http://www.mail-archive.com/[email protected]/

Reply via email to