1

修正できない奇妙な問題があります。

タイムスタンプが 1 時間より古いすべての行を削除しようとしています。

SQL:

DELETE  FROM TABLE WHERE TIMESTAMP <= SYSTIMESTAMP - 1/24

SQL Developerではコード全体が完璧に機能しますが、iBatis.netで同じことをしようとするとタイムアウトが発生します。

  <statements>
    <delete id="DeleteRows" parameterClass="int">
      <![CDATA[
      DELETE  FROM TABLE WHERE TIMESTAMP <= SYSTIMESTAMP - #VALUE#/24
<!--THIS DON'T WORK-->
      ]]>
    </delete>
  </statements>

もう1つの奇妙なことは、小なり演算子を「等しい」にぶら下げたときに問題が存在しないことです。

  <statements>
    <delete id="DeleteRows" parameterClass="int">
      <![CDATA[
      DELETE  FROM TABLE WHERE TIMESTAMP = SYSTIMESTAMP - #VALUE#/24
<!--THIS WORK-->
      ]]>
    </delete>
  </statements>

タイムアウトは、iBatis.net でのみ、Les-than および Grater-than 演算子でのみ生成されます。理由を知っている体はありますか?

面白い事実。クエリを実行DELETE FROM TABLE WHERE TIMESTAMP < '07-AUG-11'すると動作します。また、クエリを実行しようとすると、DELETE FROM TABLE WHERE TIMESTAMP BETWEEN '07-AUG-11' AND SYSTIMESTAMPそれも機能します。これらの演算子を使用せずに 1 時間より古い行を削除する他の方法は<あり ますか? ありがとう>SYSTIMESTAMP

4

2 に答える 2

1

あなたがする必要があるかもしれません

a) クエリを実行している DbCommand の CommandTimeout を増やします (iBatis.NET でそれを行う方法がわからない)

b) デッドロック (行が使用可能になるのを待っている削除ステートメント) を引き起こしているトランザクションが開いているかどうかを確認します。「Oracle で開いているトランザクションを表示する」を参照してください。

于 2016-11-02T17:44:21.537 に答える
0

私はそれを解決できたので、自分の質問に答えを追加します。将来誰かがこれを必要とするかもしれません。

最初に新しい選択クエリを作成しました:

<select id="DbTime" resultClass="DateTime">
  <![CDATA[SELECT SYSTIMESTAMP FROM DUAL]]>
</select>

次に、この選択を実行します

DateTime currentDate = DataSources.DB.QueryForObject<DateTime>("Map.DbTime", null);
DateTime finalDate= currentDate.AddHours(-24);

finalDateそしてパラメータとして 渡します

<delete id="DeleteRows">
  <![CDATA[
  DELETE FROM TABLE  WHERE TIMESTAMP < #value#
  ]]>
</delete>

現在は機能していますが、最初のソリューションがなぜ機能したいのかまだわかりません。

于 2016-11-03T14:47:48.873 に答える