Perl DBI с MySQL: как получить возвращаемое значение из хранимой процедуры? - PullRequest
1 голос
/ 02 сентября 2010

Реализует ли DBD :: mysql метод bind_param_inout ?При попытке получить следующие сообщения об ошибке:

DBD :: mysql :: st bind_param_inout не удалось: выходные параметры не реализованы [для оператора "вызов spCreateTransactionRecord (?,?)" С ParamValues:0 = Null !, 1 = Null!] At ./db.pl line 23

Мой код:

#!/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;

Хранимые процедуры объявлены как:

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

Ответы [ 2 ]

4 голосов
/ 02 сентября 2010

Новый код с обходным решением:

# 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";

Не так правильно (два вызова базы данных вместо одного), но выполняет свою работу.

2 голосов
/ 02 сентября 2010

Это известная ошибка со статусом «Проверено», означающая, что она не была устранена.

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

В этих отчетах об ошибках также есть возможный обходной путь.

Отдельное подтверждение того, что проблема все еще не решена, заключается в том, что исходный код для текущей (4.017) версии по-прежнему содержит ошибку:

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