Working with blobs

Class::DBI contains an undocumented feature for specifying that your column is going to contain data of a certain type.

For, for example, you can say: Class->data_type(column => DBI::SQL_BINARY);

This is useful for dealing with BLOBs, or to work around the problem whereby the DBI thinks that the first type of data passed to a field is what to expect in future (so if you pass a number to VARCHAR column, it won't quote any future arguments).

For DBD::Oracle if your table/class has more than one BLOB you also need an ora_field specifier:

package My::BinaryFile; use base qw/My::CDBI::Oracle::SubClass/; __PACKAGE__->primary('bin_id'); __PACKAGE__->columns('Executable' => 'executable'); __PACKAGE__->columns('HelpFile' => 'helpfile'); use DBD::Oracle qw(:ora_types); my $Excutable_type = {ora_type => ORA_BLOB, ora_field =>'executable'}; my $HelpFile_type = {ora_type => ORA_BLOB, ora_field =>'helpfile'}; __PACKAGE__->data_type(executable => $Excutable_type ); __PACKAGE__->data_type(helpfile  => $HelpFile_type );

This would be great if I could use it in the retrieve_from_sql method to solve my problem with CdbiPager.

-- ZbigniewLukasiak

For PostgreSQL, you should use the following to specify a BYTEA column:

use DBD::Pg; __PACKAGE__->data_type(column_name => {pg_type => DBD::Pg::PG_BYTEA});

However, the current version (1.32) of DBD::Pg has a bug with pre-bound columns. You'll need to apply the following patch to get it working.

-- StepanRiha

The  is an accessor method of the Class::DBI package. This means that declaring the data type of a column declares it for all classes derived from Class::DBI. This is most likely not what you want.

You can limit the column binding to your package with the following code:

# Override data_type accessor for inherited class __PACKAGE__->__data_type({}); # Now bind data types to columns __PACKAGE__->data_type(foo => $type1 ); __PACKAGE__->data_type(bar => $type2 );

-- StepanRiha