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

Reply via email to