in reply to DBD::Sybase stored procedure question

You have to tell the driver what type of values you are sending over, and you need to bind three values as you have three placeholders.

The following works:

#!/usr/bin/perl -w + use strict; use DBI qw(:sql_types); + my $dbh = DBI->connect('dbi:Sybase:server=SYBASE;database=testdb', 'sa +', 'some password'); + my $sth = $dbh->prepare("exec spSubComponentAdd \@subComponentName = ? +, \@subComponentDescription = ?, \@subComponentId = ? output"); $sth->bind_param(1, "one"); # bind_param() defaults to SQL_CHAR. $sth->bind_param(2, "two"); $sth->bind_param(3, undef, SQL_INTEGER); $sth->execute; + my (@data) = $sth->func('syb_output_params'); print "Got @data\n";
Michael

Replies are listed 'Best First'.
Re^2: DBD::Sybase stored procedure question
by martymart (Deacon) on Sep 10, 2004 at 15:00 UTC
    Hi Michael and ccn,
    Thanks to you both for your prompt responses. Michael, just so you know, I tried your solution, and while my script didn't die or anything, nothing got added to the database unfortunately. I had previously tried a solution very similar to this, but also without success.
    ccn's code did work for me however, so I was wondering if the binding is necessary??
    Thanks,
    Martymart
      No the binding isn't absolutely necessary. You can always use a "normal" SQL statement and pass all the values as literals.

      However, I wonder why nothing got added - maybe you should run a test with DBI->trace(3) and check that things actually run. There might be something that fails but that doesn't produce an error message for some reason.

      Michael