2013-07-23 91 views
4

我正在使用Oracle 10g XE。我有一個數據庫查詢 -最後修改時間沒有最後修改列的查詢

SELECT PID FROM PROUCT WHERE last_modified > '${dih.last_index_time}' 

我在這裏要做的是比較時間戳。問題是我的表沒有last_modified列,我也無法將它添加到表中。但是,有一個查詢 -

SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM PRODUCT; 

這將返回將包含所需時間戳列。

如何使用此查詢來代替last-modified列進行必要的比較?

回答

2

你簡單地把它的WHERE子句中:

SELECT PID 
    FROM PRODUCT 
WHERE SCN_TO_TIMESTAMP(ORA_ROWSCN) > '${dih.last_index_time}' 

然而,你的兩個查詢是不等價的。從ORA_ROWSCN文檔(我的重點):

對於每一行,ORA_ROWSCN返回最近在當前會話改變該行的保守上限系統改變號(SCN)。當最後一次更新行時,該僞列對於確定大約是有用的。 這不是絕對精確的,因爲Oracle通過針對行所在塊提交事務來跟蹤SCN。

這意味着,如果你在一個塊修改一行,則整個塊(多行)將具有相同的SCN。

如果您希望查詢是準確的,您需要添加LAST_MODIFIED列,或者可能啓用row-level dependency tracking。這還不是確切的:

...表中的每一行都有一個系統改變號(SCN)表示時間大於或等於修改行的最後一個事務的提交時間,

+0

查詢無效。我收到一個錯誤 - 「無法執行查詢」 –

+0

它適用於我@Archit:http://www.sqlfiddle.com/#!4/f047f/1。你可以再詳細一點嗎? – Ben

+0

Aaahh ...對不起。我的錯! 我現在得到以下錯誤 java.sql.SQLException:ORA-01843:不是有效月份 –