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

Reply via email to