【问题标题】:Shell script to delete records from Oracle DB table从 Oracle DB 表中删除记录的 Shell 脚本
【发布时间】:2018-02-23 20:39:50
【问题描述】:

我有一种情况,我需要每 30 天运行一次 shell 脚本来从 Oracle 数据库表中删除记录。

该表有一个列“updated_date”。我需要编写一个查询来删除“updated_date”小于当前日期减去 30 天的记录。

在 Java 中我可以轻松地做到这一点。如何计算动态日期并将其传递给 Unix shell 脚本中的 SQL 查询。

谁能帮帮我。

【问题讨论】:

    标签: sql oracle unix


    【解决方案1】:

    您可以使用 Littlefoot 建议的删除语句来利用数据库中的系统日期。

    但是,既然你问了——

    如何计算动态日期并将其传递给 Unix 中的 SQL 查询 外壳脚本,

    你可以这样做。

    首先,使用date命令获取'yyyy-mm-dd'格式的当前日期。

    export dt=$(date +%Y-%m-%d)
    

    然后您可以在 sqlplus 的 shell 脚本中使用日期变量。

    sqlplus -s userid/passwd@db_server<<EOF
    delete from yourtable
          where updated_date < DATE '${dt}' - 30;
    commit;
    exit
    EOF
    

    【讨论】:

      【解决方案2】:

      应该是这样的:

      delete from your_table
      where updated_date < trunc(sysdate) - 30;
      

      SYSDATE 是一个返回当前日期(和时间 - 这就是为什么我使用 TRUNC 函数将删除时间组件)的函数。这也意味着您不必计算日期并将其传递给 SQL 查询 - Oracle 自己知道。

      不过,请注意 SYSDATE 显示数据库服务器日期,所以 - 如果您在不同的时区工作,您可能需要考虑这一事实。

      还有,“负 30 天”:总是 30 天,还是您的意思是“负 1 个月”?如果是这样,您将条件更改为

      where updated_date < add_months(trunc(sysdate), -1)
      

      它会处理一个月中的天数(30、31;包括二月和闰年)。

      【讨论】:

      • 吹毛求疵:trunc() 不会“删除”时间组件,它只是将其设置为 00:00:00
      • 谢谢你,@a_horse;在我在 SO 的短暂生命中,我经常被挑剔。希望有一天我能学到足够多的东西而不是(通常是:))。
      猜你喜欢
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 2012-05-03
      • 2014-07-08
      相关资源
      最近更新 更多