Perl DBI - 获取影响事务中每个语句的记录

时间:2010-11-17 06:59:24

标签: database perl transactions dbi

HI,

我使用perl DBI do(),它将执行下面的SQL块,如下所示,它在SQL SERVER 2005中执行

    eval {
            my $result =  do(<<SQL);
            BEGIN TRAN

            UPDATE table1 SET
            col1 = 999 where date = '2010-08-27'

            DELETE FROM table1
            where date = '2010-08-30'

            COMMIT TRAN
SQL
    $logger->info($result);
};

现在我可以看到返回值$ result只包含受第一个更新语句影响的行。所以我没有关于已删除行的任何信息,但我可以看到这些行确实已在数据库中删除。 / p>

一般情况下,如果我在BEGIN TRAN,COMMIT TRAN块中有一个INSERT,DELETE,UPDATE语句,如果整个块将由DBI do()方法提交,我需要知道插入的语句的确切数量,更新的语句数和删除的语句数。

我知道SQL SERVER的@@ ROWCOUNT会在每个语句之后给出受影响的行,但这是一个SQL服务器变量,它只在块内可见。是否可以将数据导入perl?

任何帮助?

2 个答案:

答案 0 :(得分:2)

要获取@@ROWCOUNT的值,需要在“COMMIT TRAN”之前添加SELECT @@ROWCOUNT 'rowcount'作为最后一个命令,然后整个SQL将返回1行与1行数的结果集'专栏。

唯一需要注意的是,由于do()方法无法为您提供结果集,因此您需要切换到prepare()/fetchrow_array()/fetchrow_array(),或者使用其中一种包装方法,例如nsql()你的数据库库是否可用。

对于详细的插入/更新/删除细分,只需在插入/更新/删除后将那些@@ ROWCOUNTs保存到变量中,然后选择计数:

declare @update_count int
declare @delete_count int

UPDATE table1 SET
col1 = 999 where date = '2010-08-27'
SELECT @update_count = @@ROWCOUNT

DELETE FROM table1
where date = '2010-08-30'
SELECT @delete_count = @@ROWCOUNT

SELECT @update_count 'update_count', @delete_count '@delete_count'

答案 1 :(得分:1)

正在使用哪种数据库访问方法?是否有任何理由不将事务逻辑移到T-SQL之外?

如果您正在使用DBI,这些内容应符合您的要求:

eval {
    $dbh->begin_work;
        $dbh->do("CREATE TABLE #temp (col1 INTEGER, date DATETIME);");

        # Inserts
        my $inserted = $dbh->do("INSERT INTO #temp VALUES (1,'2010-08-27');");
        $inserted += $dbh->do("INSERT INTO #temp SELECT 999,'2010-08-27' UNION SELECT 5, '2010-08-30';");

        # Updates
        my $updated = $dbh->do("UPDATE #temp SET col1 = 999 WHERE date = '2010-08-27';");

        # Deleted
        my $deleted = $dbh->do("DELETE FROM #temp WHERE date = '2010-08-30';");
    $dbh->commit;

    print "Inserted $inserted rows.\n";
    print "Updated $updated rows.\n";
    print "Deleted $deleted rows.\n"; }

此代码段不考虑建立数据库连接,错误处理或关闭连接,但DBI文档应该有帮助。 http://metacpan.org/pod/DBI

如果您计划执行多个非选择语句,您可能还需要查看prepare和bind_param DBI方法。