1

私はこのような挿入をしています:

INSERT INTO TABLE 
(
 ID, 
 SOURCE_ID, 
 DATE_FIELD
) 
SELECT 
 ID,
 *,
 SYSDATE
FROM 
(
 AN SQL QUERY
);

SELECT 部分だけを実行すると、次のような値が得られます。

1, 1234, 11.04.2013 15:00:00
1, 1235, 11.04.2013 15:00:00
1, 1236, 11.04.2013 15:00:00
1, 1237, 11.04.2013 15:00:00
1, 1238, 11.04.2013 15:00:00

これはまさに私が挿入したいものです。

しかし、挿入全体を実行すると、次のような値が得られます。

1, 1234, 11.04.2013 15:00:01
1, 1235, 11.04.2013 15:00:02
1, 1236, 11.04.2013 15:00:03
1, 1237, 11.04.2013 15:00:04
1, 1238, 11.04.2013 15:00:05

sysdate がこのように動作する理由と、適切な回避策を知っている人はいますか?

4

3 に答える 3

1

少なくとも 6.1 のドキュメントによると、各日付/時刻関数は、特定のトランザクションに対して同じタイムスタンプを与える必要があります。したがって、異なる結果が得られている場合は、派生テーブルからデータを少しずつ引き出していると思います。

派生テーブルに sysdate を入れてみて、問題が解決するかどうかを確認してください。

于 2013-04-11T17:21:53.527 に答える
1

これは、SYSDATE が期待どおりに返されない理由を説明していません (実際、ドキュメントによれば安定していると考えられています) が、代わりに NOW() を使用できますか?

SYSDATE は 1 つのステートメント内で常に同じ値を返し、NOW() はトランザクション内で常に同じ値を返します。バックグラウンドで INSERT .. SELECT が複数のステートメントに分割されている可能性があります (これには驚かされるかもしれませんが、これはご覧のとおりの動作です)。

于 2013-04-12T06:02:15.703 に答える