首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在早于1小时的oracle数据库中删除行,导致超时

在早于1小时的oracle数据库中删除行,导致超时
EN

Stack Overflow用户
提问于 2016-11-02 17:38:51
回答 2查看 673关注 0票数 1

我有个奇怪的问题我解决不了。

我正在尝试删除它们时间戳大于1小时的所有行。

SQL:

代码语言:javascript
复制
DELETE  FROM TABLE WHERE TIMESTAMP <= SYSTIMESTAMP - 1/24

在SQL中,整个代码工作得很完美,但是当我尝试在iBatis.net中做同样的工作时,就会有超时。

代码语言:javascript
复制
  <statements>
    <delete id="DeleteRows" parameterClass="int">
      <![CDATA[
      DELETE  FROM TABLE WHERE TIMESTAMP <= SYSTIMESTAMP - #VALUE#/24
<!--THIS DON'T WORK-->
      ]]>
    </delete>
  </statements>

另一件奇怪的事情是,当我把小于运算符的值改为“相等”时,这个问题就不存在了。

代码语言:javascript
复制
  <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的结合似乎是个问题,还有其他方法可以在不使用这些操作符的情况下删除一个小时以上的行吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-03 14:47:48

给我自己的问题加上答案,因为我能够解决这个问题,也许将来会有人需要这个。

首先我创建了新的select查询:

代码语言:javascript
复制
<select id="DbTime" resultClass="DateTime">
  <![CDATA[SELECT SYSTIMESTAMP FROM DUAL]]>
</select>

然后运行以下选择

代码语言:javascript
复制
DateTime currentDate = DataSources.DB.QueryForObject<DateTime>("Map.DbTime", null);
DateTime finalDate= currentDate.AddHours(-24);

并将finalDate作为参数传递

代码语言:javascript
复制
<delete id="DeleteRows">
  <![CDATA[
  DELETE FROM TABLE  WHERE TIMESTAMP < #value#
  ]]>
</delete>

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

票数 0
EN

Stack Overflow用户

发布于 2016-11-02 17:44:21

你可能需要

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

( b)检查是否已打开事务,从而导致死锁(删除stmt等待行可用),请参见View open transactions in Oracle

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40386323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档