2011-11-27 214 views
2

我最近已经将Perl应用程序表单甲骨文移植到Postgres(我第一次使用Postgres),并且我被一个小问题难倒,我可以将其缩小到以下示例代码:localtimestamp总是返回相同的值

use strict; 
use warnings; 
use DBI; 

my @db_params = qw (dbi:Pg:host=127.0.0.1;database=test test test); 

my $dbh = DBI->connect(@db_params, {AutoCommit => 0 }) or die ; 
while (1) { 
    my $sth = $dbh->prepare_cached('SELECT localtimestamp ') or die; 
    $sth->execute() or die; 
    my $result = $sth->fetchall_arrayref(); 
    print $result->[0][0] , "\n"; 
    sleep(5); 
} 

此输出:

2011-11-27 16:46:25.94291 
2011-11-27 16:46:25.94291 
2011-11-27 16:46:25.94291 

我收到相同的时间戳所有的时间,除非我断开并重新连接到数据库。

我怎样才能确保有时间我从数据库中选择localtimestamp我得到的值与执行sql的时间相对应?

回答

5

由于您未使用自动提交,因此您始终处于同一事务中,并且localtimestamp在Postgres中的该事务的开始处获取了时间戳。即您需要使用$dbh->begin_work$dbh->commit为您的查询创建单个交易。

+0

你说得对!奇怪的是,我没有指出Oracle和Pg之间的交易工作方式不同。原始代码在Oracle中按预期工作,无需提交事务! – Pat

+0

的确如此,Oracle的行为有所不同,但如果您在一次事务中更改一堆行的时间戳,那么如果他们获得完全相同的时间戳,对我来说更有意义。 – Cito

+0

在交易中发生的所有事情都被认为会在同一时间发生。 PostgreSQL处理交易中的时间戳在逻辑上更准确。 –

2

另请参阅manual中的statement_timestampclock_timestamp函数。

相关问题