尝试删除超过1小时的oracle数据库中的行导致超时

时间:2016-11-02 17:38:52

标签: c# oracle ibatis.net systimestamp

我有一个奇怪的问题,我无法解决。

我正在尝试删除时间戳超过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>

另一个奇怪的问题是,当我将“操作员”改为“等于”时,问题不存在 e.g

  <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相结合似乎有问题 是否有其他方法可以删除超过一小时的行而不使用这些运算符? 感谢

2 个答案:

答案 0 :(得分:1)

您可能需要

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

b)检查您是否打开了一个事务,导致死锁(删除stmt等待行可用),请参阅View open transactions in Oracle

答案 1 :(得分: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>

现在它正在运作,但仍然不知道为什么我的第一个解决方案想要工作。