首页 文章

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

提问于
浏览
0

HI,

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

eval {
my $ result = do(<< SQL);
开始了

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

从table1中删除
where date ='2010-08-30'

COMMIT TRAN
SQL
$ logger->信息($结果);
};

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

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

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

有帮助吗?

2 回答

  • 1

    要获取 @@ROWCOUNT 的值,需要在"COMMIT TRAN"之前添加 SELECT @@ROWCOUNT 'rowcount' 作为最后一个命令,然后整个SQL将返回1行的结果集,其中包含1 'rowcount'列 .

    唯一需要注意的是,由于 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'
    
  • 2

    正在使用什么数据库访问方法?是否有任何理由不将事务逻辑移到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

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

相关问题