在事务中,使用insert和select的perl mySQL过程失败

时间:2012-04-03 09:21:53

标签: mysql perl transactions

这是我的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;放在executefetchrow_array之后,我会收到 Commands out of sync 错误。
如果我删除了AutoCommit行,代码可以正常运行,但我无法使用交易 如果我在子广告期间尝试更改AutoCommit,则会收到以下错误: Turning off AutoCommit failed

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您无法从存储过程中提取值。

使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(?,?,?)');

编辑:MySQL存储过程实际上可以返回结果 - 过程中的SELECT语句的结果被发送回SQL客户端。您在DBD :: mysql中发现了一个错误。以上是解决方法。