使用 groovy:更新时间戳 oracle 列

Posted

技术标签:

【中文标题】使用 groovy:更新时间戳 oracle 列【英文标题】:Using groovy: update timestamp oracle column 【发布时间】:2018-07-20 08:02:16 【问题描述】:

我有两个 groovy 脚本,它们分别对具有字符串列和两个时间戳列的 oracle 表进行插入和更新,创建如下:

CREATE TABLE sn_token (
    "token" varchar2(500 char) NOT NULL,
    created_at timestamp NOT NULL,
    updated_at timestamp,
    PRIMARY KEY ("token")
);

在第一个 groovy 脚本中,我使用这个 groovy 代码 sn-p 在此表上进行插入(我省略了与数据库建立连接的 sn-p 代码):

import java.util.Date;
import org.joda.time.DateTime;

DateTime now = DateTime.now()
Date date = now.toDate()
def createdTimestamp = date.toTimestamp()
def map = [token : "myToken", created_at : createdTimestamp]
sql.execute "INSERT INTO sn_token (\"token\", created_at) VALUES ($map.token, $map.created_at)"

一切都好,存储的、登录到控制台的时间戳是:

2018-07-20 09:38:24.191

在第二个脚本中,我使用这个 groovy 代码 sn-p 对同一行进行更新(我省略了与数据库建立连接的 sn-p 代码):

import java.util.Date;
import org.joda.time.DateTime;

DateTime now = DateTime.now()
Date date = now.toDate()
def updatedTimestamp = date.toTimestamp()
def myToken = "myToken"
sql.execute 'UPDATE sn_token SET updated_at = \'' + updatedTimestamp + '\' WHERE "token" = \'' + myToken + '\''

updatedTimestamp 变量登录到控制台的值为:

2018-07-20 09:40:44.706

生成的查询是:

UPDATE sn_token SET updated_at = '2018-07-20 09:40:44.706' WHERE "token" = "myToken"

虽然两个时间戳变量格式相同,但是更新sql返回错误

ORA-01843: not a valid month

我不明白为什么..

谁能帮我解决这个问题?

谢谢

【问题讨论】:

您依赖于日期格式的数据库设置。您应该在查询中使用 oracle to_date 函数并提供正确的格式,例如:to_date('2018-07-20 09:20:10','rrrr-mm-dd hh24:mi:ss') 【参考方案1】:

为了您自己,在创建 Oracle 对象时去掉双引号。默认情况下,它们将以大写形式创建,但您可以随意引用(大​​写、小写、混合大小写)。如果您坚持将列创建为"token",那么您必须始终以这种方式引用它(双引号,小写名称)。


至于你的问题:看看TO_TIMESTAMP 是否解决了问题。这是一个例子:

SQL> create table sn_token
  2    (token      varchar2(10),
  3     updated_at timestamp
  4    );

Table created.

SQL>
SQL> insert into sn_token (token) values (1);

1 row created.

SQL> update sn_token set
  2    updated_at = to_timestamp('2018-07-20 09:40:44.706', 'yyyy-mm-dd hh24:mi:ss.ff3');

1 row updated.

SQL> select * from sn_token;

TOKEN      UPDATED_AT
---------- ------------------------------
1          20.07.18 09:40:44,706000

SQL>

【讨论】:

非常感谢,使用 to_timestamp 函数可以正常工作。但是我需要如何在更新语句中使用这个函数呢? Ps:感谢关于双引号的建议。 不客气。说“我多么需要......” - 你的意思是“为什么”?好吧,因为 - 如果您尝试插入一些包含在单引号中的值,Oracle 会将其视为字符串。它尝试将其隐式转换为时间戳,但是 - 如果它失败(因为您的系统的时间戳格式与您提供的不同)并引发错误。但是,如果您将该字符串显式转换为时间戳(使用 TO_TIMESTAMP 函数),则毫无疑问。

以上是关于使用 groovy:更新时间戳 oracle 列的主要内容,如果未能解决你的问题,请参考以下文章

创建表列时如何正确使用 ON UPDATE CURRENT_TIMESTAMP?

Oracle:如何在模式中找到上次更新(任何表)的时间戳?

将时间戳插入 Oracle 数据库中的 Varchar2 列

使用默认值添加不可为空的列时的 Oracle 错误

在oracle中选择第n列时出错[重复]

更新另一列时自动更新sql列