Perl MySQL процедура вставки и выбора не удается в транзакции - PullRequest
3 голосов
/ 03 апреля 2012

Это мой perl-код:

my $dbc = DBI->connect('DBI:mysql:test', "entcfg", "entcfg") || die "Could not connect to database: $DBI::errstr";
$dbc->{TraceLevel} = "2"; #debug mode
$dbc->{AutoCommit} = 0; #enable transactions, if possible
$dbc->{RaiseError} = 1; #raise database errors

###sql commands
my $particle_value = $dbc->prepare('CALL particle_test_value(?,?,?,?)');
my $particle_name = $dbc->prepare('CALL particle_test_name(?,?,?,?)');
my $table_test = $dbc->prepare('CALL table_test(?,?,?)');

sub actionMessage {
    my ($sh,$msgobj) = @_;

    my @result;
    my $return_ID;

    eval {
        $table_test->execute(undef,"value","value"); #new item
        $return_ID = $table_test->fetchrow_array(); #get new row id
    };
    if ($@) {
        warn $@; # print the error
    }
}

Транзакция mySQL выглядит следующим образом:

CREATE DEFINER=`root`@`localhost` PROCEDURE `table_test`(
    v_id INT,
    v_name VARCHAR(255),
    v_value VARCHAR(255)
)
BEGIN
        INSERT INTO test (name,value) VALUES (v_name,v_value);
        SELECT LAST_INSERT_ID();
END

Если я поставлю $dbc->commit; после execute или fetchrow_array, Я получаю Commands out of sync ошибку.
Если я удаляю строку AutoCommit, код работает, но я не могу использовать транзакции.
Если я пытаюсь изменить AutoCommit во времясуб, я получаю эту ошибку: Turning off AutoCommit failed.

Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 04 апреля 2012

Вы не можете извлечь значения из хранимых процедур, подобных этой.

Сделать table_test функцией:

CREATE DEFINER=`root`@`localhost` FUNCTION `table_test`( 
    v_name VARCHAR(255),
    v_value VARCHAR(255)
) RETURNS integer
BEGIN
        INSERT INTO test (name,value) VALUES (v_name,v_value);
        RETURN LAST_INSERT_ID();       
END //

и пусть $ table_test использует его как функцию:

my $table_test = $dbc->prepare('SELECT table_test(?,?,?)');

edit: хранимые процедуры MySQL могут фактически возвращать результаты - результат оператора SELECT внутри процедуры отправляется обратно клиенту SQL. Вы нашли ошибку в DBD :: mysql. Вышеуказанное работает как обходной путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...