I'm calling some stored procedures using DBI 1.32, DBD::ODBC 1.07 and 
Perl v5.8.0 (ActivePerl build 805) running on Win2kServer SP4 using 
MS SQL 2000.

Am I supposed to initialize the variables I pass to 
bind_param_inout()?

I'm using code like this to prepare and call the stored procedures 
and fetch the OUTPUT parameters:

sub prepare_sps {
        $sp{GetLocationInfo_p}
                = $db->prepare('EXEC dbo.GetLocationInfo '. join(', ',('?') x 5));
                # parameters 2-5 are OUTPUT!
        {
                my ($JobCity, $JobState, $JobCountry, $JobZIP)
                        = ( " "x 50, " "x 50, "  ", " "x 5);
                my $sp = $sp{GetLocationInfo_p};
                $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_CHAR);
                $sp->bind_param_inout(5, \$JobZIP, 5, DBI::SQL_CHAR);

                $sp{GetLocationInfo} = sub {
                        $sp->bind_param(1, $_[0]);
                        $sp->execute();
                        $_[1] = $JobCity;
                        $_[2] = $JobState;
                        $_[3] = $JobCountry;
                        $_[4] = $JobZIP;
                        s/^\s+//,s/\s+$// for ($_[1..4]);
                }
        };
        ...
}
...

$sp{GetLocationInfo}->($jobLocationId, $JobCity, $JobState, 
$JobCountry, $JobZIP);

The stored proc looks like this:

CREATE PROCEDURE dbo.GetMonsterLocationInfo(
        @LocationID Int,
        @City varchar(50) OUTPUT,
        @State varchar(50) OUTPUT,
        @Country char(2) OUTPUT,
        @Zip char(5) OUTPUT
) AS
BEGIN
        SELECT @Zip = ZipCode, @State = State, @Country = Country, @City = 
MappedCity
          FROM dbo.LocationLookup WITH (NOLOCK)
         WHERE ID = @LocationID
END

The problem is that if I do not initialize the $JobXxxx variables 
with those spaces:

        my ($JobCity, $JobState, $JobCountry, $JobZIP)
                = ( " "x 50, " "x 50, "  ", " "x 5);

I only get the first letters of the values. Once I do initialize the 
variables I do get the right and complete values even in a loop, even 
if the value in a later iteration is longer than the one in a 
previous.
I do get the same incorrect results if the variables are undef or "".

Why is that? Is this something I missed in the docs? Or is it a bug 
in DBD::ODBC? Or ...?

Thanks, Jenda

== [EMAIL PROTECTED] == http://Jenda.Krynicky.cz ==
I wonder why the whole chemistry industry ignores
computer bugs. We all would gladly pay big bucks 
for a functional insecticide.

Reply via email to