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>

另一个奇怪的事情是,当我将小于运算符挂到“等于”时,问题就不存在了,例如

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

我只使用 Les-than 和 grater-than 运算符生成超时,并且仅在 iBatis.net 中生成。有谁知道为什么?

有趣的事实。当我查询DELETE FROM TABLE WHERE TIMESTAMP < '07-AUG-11'它的工作。另外,当我尝试查询时DELETE FROM TABLE WHERE TIMESTAMP BETWEEN '07-AUG-11' AND SYSTIMESTAMP,它也可以工作。似乎只有与组合在一起才有问题<是否>SYSTIMESTAMP 其他方法可以在不使用这些运算符的情况下删除超过一小时的行?谢谢

4

2 回答 2

1

你可能需要

a) 增加运行查询的 DbCommand 的 CommandTimeout(不确定如何在 iBatis.NET 中执行)

b)检查是否有一个事务打开,这会导致死锁(delete stmt 等待行可用),请参阅在 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 回答