我有个奇怪的问题我解决不了。
我正在尝试删除它们时间戳大于1小时的所有行。
SQL:
DELETE FROM TABLE WHERE TIMESTAMP <= SYSTIMESTAMP - 1/24在SQL中,整个代码工作得很完美,但是当我尝试在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>超时值I只用于Les-than和grater--而不是操作符,而且只在iBatis.net中。有人知道为什么吗?
有趣的事实。当我查询DELETE FROM TABLE WHERE TIMESTAMP < '07-AUG-11'时,它可以工作。另外,当我试图查询DELETE FROM TABLE WHERE TIMESTAMP BETWEEN '07-AUG-11' AND SYSTIMESTAMP时,它也能工作。<和>与SYSTIMESTAMP的结合似乎是个问题,还有其他方法可以在不使用这些操作符的情况下删除一个小时以上的行吗?谢谢
发布于 2016-11-03 14:47:48
给我自己的问题加上答案,因为我能够解决这个问题,也许将来会有人需要这个。
首先我创建了新的select查询:
<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-02 17:44:21
你可能需要
( a)增加运行查询的CommandTimeout (不确定如何在iBatis.NET中执行)
( b)检查是否已打开事务,从而导致死锁(删除stmt等待行可用),请参见View open transactions in Oracle
https://stackoverflow.com/questions/40386323
复制相似问题