On 07/02/12 09:28, Martin J. Evans wrote:
> On 07/02/12 04:56, Steve Baldwin wrote:
>> #!/usr/bin/perl -w
>> use strict;
>> use warnings;
>> use DBI;
>> use Encode;
>>
>> sub main {
>> my $dbh = DBI->connect(
>> 'dbi:Oracle:',
>> 'usr/pwd@instance',
>> '',
>> { PrintError => 0, AutoCommit => 0, RaiseError => 1, },
>> );
>> print {*STDERR} 'Connected !', "\n";
>> $dbh->do(q(alter session set nls_territory = 'GERMANY'));
>> my $sql =<<'END_SQL';
>> SELECT ltrim(rtrim(to_char(0, 'L')))
>> FROM dual
>> END_SQL
>> my $sth = $dbh->prepare($sql);
>> $sth->execute;
>> my ($val);
>> $sth->bind_columns(\($val));
>> while ($sth->fetch) {
>> print {*STDERR} 'val=[', $val, '] len=', length($val), "\n";
>> }
>> if (Encode::is_utf8($val)) {
>> print {*STDERR} ' utf8 is on', "\n";
>> } else {
>> print {*STDERR} ' utf8 is off', "\n";
>> }
>> $sth->finish;
>> $sql =<<'END_SQL';
>> declare
>> l_ret varchar2(10);
>> begin
>> select ltrim(rtrim(to_char(0, 'L')))
>> into l_ret
>> from dual;
>> --
>> :ret := l_ret;
>> end;
>> END_SQL
>> undef $val;
>> $sth = $dbh->prepare($sql);
>> $sth->bind_param_inout(':ret', \$val, 100);
>> $sth->execute;
>> print {*STDERR} 'val=[', $val, '] len=', length($val), "\n";
>> if (Encode::is_utf8($val)) {
>> print {*STDERR} ' utf8 is on', "\n";
>> } else {
>> print {*STDERR} ' utf8 is off', "\n";
>> }
>> $dbh->disconnect;
>> return 0;
>> }
>>
>> exit main();
>
> Fails for me to with the very latest DBD::Oracle from subversion trunk.
>
> Is it a bug? I guess so as DBD::Oracle is supposed to do the right thing.
>
> Try this change:
>
> Index: dbdimp.c
> ===================================================================
> --- dbdimp.c (revision 15130)
> +++ dbdimp.c (working copy)
> @@ -3197,7 +3197,14 @@
> if (SvPVX(sv)) {
> SvCUR_set(sv, phs->alen);
> *SvEND(sv) = '\0';
> - SvPOK_only_UTF8(sv);
> + SvPOK_only_UTF8(sv);
> + if (CSFORM_IMPLIES_UTF8(SQLCS_IMPLICIT)) {
> +#ifdef sv_utf8_decode
> + sv_utf8_decode(sv);
> +#else
> + SvUTF8_on(sv);
> +#endif
> + }
> }
> else { /* shouldn't happen */
> debug = 2;
>
> It seems to work for me but I don't really understand why DBD::Oracle code calls SvPOK_only_UTF8 as I cannot see why UTF8 status of the scalar would already be on.
>
> BTW, that code originates from a patch in April 2002 so it is OLD code - http://www.mail-archive.com/dbi-users@perl.org/msg10046.html
>
> You should probably rt this at rt.cpan.org.
>
> Martin
Steve reported that this fixed his issue and Yanick has applied the patch and added a test to DBD::Oracle trunk. I think it still needs adding to the second case which is for truncated data but we'll sort that out too.
The rt is https://rt.cpan.org/Public/Bug/Display.html?id=74753.
Thanks for the report Steve.
Martin
--
Martin J. Evans
Easysoft Limited
http://www.easysoft.com
|