2010-09-02 201 views
1

是否DBD :: mysql執行bind_param_inout方法? 我收到以下錯誤消息嘗試它的時候了:Perl DBI與MySQL:如何從存儲過程獲取返回值?

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

我的代碼:

#!/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 
) 
+0

環境:使用默認mysql安裝的Ubuntu 10(5.1)和perl 5.10.1以及從CPAN剛剛安裝的模塊 – emx 2010-09-02 14:08:57

回答

2

這是一個已知的bug與「已驗證」狀態,這意味着它從未得到解決。

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

這錯誤報告還包含一個可能的解決方法。

一個單獨的確認,這個問題仍然沒有解決的是the source code for the current (4.017) version仍然有錯誤:

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

謝謝。這就是我所害怕的。奇怪的是,他們還沒有解決這個問題,因爲它已經在2006年報道過了。 – emx 2010-09-02 14:32:03

3

有一種變通方法的新代碼:

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

還不如適當(二數據庫調用而不是一個),但是完成這項工作。