From: "Jeff Urlwin" <[EMAIL PROTECTED]>
> It could be a bug. Can you wrap up a quick test case and I'll trace
> it through?
>
> Regards,
>
> Jeff
Sorry for the delay.
#!perl
use DBI;
my $PROC = <<'*END*';
CREATE PROCEDURE dbo.GetL__ocationInfo(
@LocationID Int,
@City varchar(50) OUTPUT,
@State varchar(50) OUTPUT,
@Country char(2) OUTPUT,
@Zip char(5) OUTPUT
) AS
BEGIN
SET @Zip = '12345';
SET @State = 'Whatever';
SET @Country = 'US'
SET @City = 'Some City ' + Convert(varchar(10), @LocationID)
END
*END*
$db = DBI->connect('dbi:ODBC:xxxx', 'xxx', 'xxx',
{PrintError => 0,RaiseError => 1,LongReadLen => 65536,AutoCommit =>
1});
$db->do($PROC);
eval{
{
my ($JobCity, $JobState, $JobCountry, $JobZIP);
# this one returns just one char in each output variable in the
first call
# my ($JobCity, $JobState, $JobCountry, $JobZIP) = ('','','','');
# this one returns just one char in each output variable in the
first call
# my ($JobCity, $JobState, $JobCountry, $JobZIP) = ( " "x 50, " "x
50, " ", " "x 5);
# my ($JobCity, $JobState, $JobCountry, $JobZIP) = ("\0" x 50, "\0"
x 50, "\0" x 2, "\0" x 5, );
# the two above work fine
# my ($JobCity, $JobState, $JobCountry, $JobZIP) = ( " "x 3, " "x 3,
" ", " "x 3);
# my ($JobCity, $JobState, $JobCountry, $JobZIP) = ( " ", " ", " ",
" ");
# it's strange but these two work fine
my $sp = $db->prepare('EXEC dbo.GetL__ocationInfo '. join(',
',('?') x 5));
$sp->bind_param_inout(2, \$JobCity, 50, DBI::SQL_VARCHAR);
$sp->bind_param_inout(3, \$JobState, 50, DBI::SQL_VARCHAR);
$sp->bind_param_inout(4, \$JobCountry, 2, DBI::SQL_VARCHAR);
$sp->bind_param_inout(5, \$JobZIP, 5, DBI::SQL_VARCHAR);
sub GetLocation {
$sp->bind_param(1, $_[0]);
$sp->execute();
$_[1] = $JobCity;
$_[2] = $JobState;
$_[3] = $JobCountry;
$_[4] = $JobZIP;
}
}
my ($JobCity, $JobState, $JobCountry, $JobZIP);
GetLocation( 10, $JobCity, $JobState, $JobCountry, $JobZIP);
print "'" . join( "', '", $JobCity, $JobState, $JobCountry,
$JobZIP) . "'\n";
GetLocation( 15456, $JobCity, $JobState, $JobCountry, $JobZIP);
print "'" . join( "', '", $JobCity, $JobState, $JobCountry,
$JobZIP) . "'\n";
GetLocation( 15457716, $JobCity, $JobState, $JobCountry, $JobZIP);
print "'" . join( "', '", $JobCity, $JobState, $JobCountry,
$JobZIP) . "'\n";
};
$db->do('DROP PROCEDURE dbo.GetL__ocationInfo');
__END__
If I do not initialize the variables or initialize them to '' then
the first call returns just the first characters of the return
values, in all other cases it works correctly.
The second and following calls work fine, even if the values are
longer than the ones returned before.
# $Id: DBI.pm,v 11.43 2004/02/01 11:16:16 timbo Exp $
$DBI::VERSION = "1.43"; # ==> ALSO update the version in the pod text
below!
# $Id: ODBC.pm 124 2004-02-22 15:57:00Z jurl $
$DBD::ODBC::VERSION = '1.07';
This is perl, v5.8.0 built for MSWin32-x86-multi-thread
...
Binary build 805 provided by ActiveState Corp.
http://www.ActiveState.com
Built 18:08:02 Feb 4 2003
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002
14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise
Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
Thanks, Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed
to get drunk and croon as much as they like.
-- Terry Pratchett in Sourcery