Hi, I've just hit a problem with bind_col and fetchall_arrayref when a slice is used and I'm wondering how I might fix it. I'm using DBD::Oracle and setting a bind type and some attributes but as soon as a slice is used in fetchall_arrayref, DBI rebinds the columns and I lose the column type and attribute. Here is an example:
# $sth is just a select with 4 column # the first column is an integer and we want to keep it that way # as the result will be JSONified and we don't want JSON to think it # is a string and put quotes around it $sth->bind_col (1, undef, {TYPE => SQL_INTEGER, DiscardString => 1}); my $list = $sth->fetchall_arrayref({}); print Dumper ($list); Without the slice it produces: $VAR1 = [ [ 11, 'Abandoned', '1358247475.860400', '1358247475.860400' ], and with the slice it produces: $VAR1 = [ { 'modified_date_time' => '1358247475.860400', 'market_status_id' => '11', 'name' => 'Abandoned', 'created_date_time' => '1358247475.860400' }, Notice the slice caused the market_status_id to look like a string. This happens because DBI binds the columns when you use a slice and it is overriding what was set for column 1 in the bind this code does. So this is how bind_col ends up being called: BIND COL 1 (TYPE => SQL_INTEGER, DiscardString => 1) BIND COL 1 (no type (i.e. type = 0) and no attrs) BIND COL 2 (no type and no attrs) BIND COL 3 (no type and no attrs) BIND COL 4 (no type and no attrs) The code in DBD::Oracle is possibly flawed in that every time bind_col is called it does: imp_sth->fbh[field-1].req_type = type; imp_sth->fbh[field-1].bind_flags = 0; /* default to none */ regardless of whether bind_col has been called before and set a type or attributes. As type is a parameter to dbd_st_bind_col anyone not wishing to set a type has to say 0. I could fix my usage case by simply saying if bind_col has been called for a column which already has a type set and the incoming type is 0 don't touch it and if no attributes are passed don't clear any existing ones. It would work for me but I'd like to hear any comments. Martin