我有一个奇怪的问题,我无法解决。
我正在尝试删除时间戳超过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
相结合似乎有问题
是否有其他方法可以删除超过一小时的行而不使用这些运算符?
感谢
答案 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>
现在它正在运作,但仍然不知道为什么我的第一个解决方案想要工作。