2012-04-03 7 views
3

Das ist mein Perl-Code ist:perl mySQL Verfahren mit Einsatz und wählen Sie schlägt fehl, wenn in der Transaktion

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 ([email protected]) { 
     warn [email protected]; # print the error 
    } 
} 

Die mySQL Transaktion wie folgt:

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 

Wenn ich setzen $dbc->commit; nach dem execute oder fetchrow_array, bekomme ich eine Commands out of sync Fehler. Wenn ich die AutoCommit Zeile entferne, funktioniert der Code, aber ich kann keine Transaktionen verwenden.
Wenn ich versuche, AutoCommit während der Sub zu ändern, erhalte ich diesen Fehler: Turning off AutoCommit failed.

Jede Hilfe würde sehr geschätzt werden.

+0

Duplizieren: http://stackoverflow.com/q/6454840/132382 – pilcrow

Antwort

1

Sie können Werte aus gespeicherten Prozeduren nicht extrahieren.

Machen table_test eine Funktion:

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 // 

und haben $ table_test es verwenden, wie eine Funktion:

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

edit: MySQL gespeicherte Prozeduren können tatsächlich Ergebnisse angezeigt - das Ergebnis einer SELECT-Anweisung innerhalb Die Prozedur wird an den SQL-Client gesendet. Sie haben einen Fehler in DBD :: mysql gefunden. Das obige funktioniert als Workaround.

+0

Funktioniert perfekt. Danke für die Verbesserung meiner Kenntnisse von mySQL! – Zone12

+0

Irreführend. MySQL-Prozeduren * können tatsächlich Ergebnismengen zurückgeben, und DBD :: mysql kann sie abrufen. Es gibt einen Fehler im Perl-Treiber, jedoch unter AutoCommit = 0 – pilcrow

+0

Entschuldigung. Ich habe in den MySQL-Dokumenten gelesen, dass Prozeduren "nur Werte mit Ausgabevariablen zurückgeben können", und ging damit. Ich habe meine Antwort geändert. –

Verwandte Themen