2010-09-02 18 views
1

Est-ce que DBD :: mysql implémente la méthode bind_param_inout? Je reçois des messages d'erreur suivants lors de l'essayer:Perl DBI avec mysql: comment obtenir la valeur de retour d'une procédure stockée?

DBD::mysql::st bind_param_inout failed: Output parameters not implemented [for Statement "call spCreateTransactionRecord(?, ?)" with ParamValues: 0=Null!, 1=Null!] at ./db.pl line 23

Mon code:

#!/usr/bin/perl 

use strict; 
use warnings; 
use DBI; 
use DBI qw(:sql_types); 
use Data::Dumper; 

my ($dbh, $dsn, $sth, $sql); 
my ($RecID, TypeID); 
my ($user, $pass) = ''; 

# Open DB connection 
$dsn = "dbi:mysql:database=mp;mysql_read_default_file=$ENV{HOME}/.my.cnf"; 
$dbh = DBI->connect($dsn, $user, $pass, 
      {RaiseError=>1, AutoCommit=>0, ShowErrorStatement=>1}) 
      || die "DB open error: $DBI::errstr"; 

# Call stored procedure 
$sql = "call spCreateTransactionRecord(?, ?)"; 
$sth = $dbh->prepare($sql); 
$sth->bind_param_inout(2, \$p_RecID, 11, {TYPE=>SQL_INTEGER}); 
$sth->execute($p_TypeID) || print $sth->errstr; 

# Disconnects 
$dbh->commit(); 
$dbh->disconnect; 

Les procédures stockées est déclarée comme:

CREATE PROCEDURE spCreateTransactionRecord (
    IN p_TypeID INTEGER, 
    OUT p_RecID INTEGER 
) 
+0

Environnement: Ubuntu 10 avec l'installation mysql par défaut (5.1) et perl 5.10.1 avec les modules fraîchement installés du CPAN – emx

Répondre

2

Il est un bug connu avec Statut "vérifié", ce qui signifie qu'il n'a jamais été traité.

http://bugs.mysql.com/bug.php?id=23554

que les rapports de bugs contient également une solution de contournement possible.

Une confirmation distincte que la question est toujours pas abordée est que the source code for the current (4.017) version a toujours l'erreur:

if (is_inout) 
{ 
    do_error(sth, JW_ERR_NOT_IMPLEMENTED, "Output parameters not implemented", NULL); 
    return FALSE; 
} 
+0

Merci. C'est ce dont j'avais peur. Étrange qu'ils n'ont pas encore corrigé ce bug, vu qu'il a été rapporté en 2006. – emx

3

Le nouveau code avec une solution de contournement:

# Call stored procedure 
$sql = "call spCreateTransactionRecord($p_TypeID, \@rtnVal)"; 
$dbh->do($sql); 
$p_RecID = $dbh->selectrow_array('SELECT @rtnVal'); 
print "Received RecID = $p_RecID\n"; 

Pas aussi propres (deux appels de base de données au lieu d'un) mais fait le travail.