2015-02-13 2 views
0

Я использую модуль DBI Perl с MySQL и пытаюсь получить начальное значение перед добавлением 1 к нему при обновлении строки.Perl MySQL DBI - обновить и получить последнее значение

Если текущее значение было 1000, мне нужно вернуть значение 1000, а затем добавить 1 к значению.

Я использую это заявление в Perl использовать одну транзакцию ...

update TABLE_NAME set ID = (\@cur_value := ID) + 1 

Я знаю, что может сделать выбор, то обновление в виде двух заявлений или заблокировать таблицы вручную, но транзакция произойдет так быстро на нашей платформе что это может привести к несогласованности, и это самый быстрый способ сделать это.

Однако я просто не могу найти способ вернуть исходное значение до приращения, используя этот оператор.

Это отлично работает в ASP, как показано ниже:

qry = "update V15_TRACKING set TRACKING_ID = (@cur_value := TRACKING_ID) + 1 where TRACKING_TYPE='ABC'" 
Set oRS = oConn.Execute(qry) 
qry = "select @cur_value" 
if not oRS.EOF then 
     while not oRS.EOF 
      CurrTrackingID = oRs.Fields("@cur_value") 
      oRS.movenext 
     wend 
    oRS.close 
    end if 

Пожалуйста, может кто-то советовать, что мне нужно сделать, чтобы вернуть исходное значение в Perl, как я искал везде и перепробовали все виды решений.

ответ

1

Фрагмент, чтобы показать, что вы на самом деле делаете в perl, и ваш результат поможет диагностировать, что происходит в вашем скрипте.

Я попробовал этот тривиальный пример:

децибела:

CREATE DATABASE TEST; 

CREATE TABLE foo (
    id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    val int(11) NOT NULL 
); 

INSERT INTO foo (val) VALUES (1); 

И на Perl

#!/bin/env perl 
use strict; 
use warnings; 

use Data::Dumper; 
use DBI; 

my $dbh = DBI->connect('DBI:mysql:database=test', 'dbuser', 'dbpass'); 

my $select = $dbh->prepare('SELECT * FROM foo WHERE id=?'); 
my $select_old_val = $dbh->prepare('SELECT @old_val'); 
my $update = $dbh->prepare('UPDATE foo SET val=(@old_val := val) + 1 WHERE id=?'); 

$update->execute(1); 
$select_old_val->execute(); 
$select->execute(1); 

while (my $row = $select_old_val->fetchrow_hashref) { 
    print Dumper $row; 
} 


while (my $row = $select->fetchrow_hashref) { 
    print Dumper $row; 
} 

И после того, как несколько выходит:

$ perl select_and_update.pl 
$VAR1 = { 
      '@old_val' => '10' 
     }; 
$VAR1 = { 
      'id' => '1', 
      'val' => '11' 
     }; 
+0

Там не было никакого смысла код публикации, так как у меня не было примера который будет работать, и предположил, что заявление о том, где я боролся, было самоочевидным, и кто-то вроде вас, вероятно, вернется с примером того, что будет работать. Но я вижу, что мне нужно делать. Я довольно склонна к perl, но это было у меня голова царапин. Но спасибо за ваш вклад, очень ценим. –

+0

Ну, рад, что я мог бы помочь. Если это разрешило ваш вопрос, отметьте его как принятый –