2011-11-27 111 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函數。