Использование groovy: обновить метку времени
У меня есть два скрипта groovy, которые делают соответственно вставку и обновление таблицы оракула, в которой есть строковый столбец и два столбца отметки времени, созданные следующим образом:
CREATE TABLE sn_token (
"token" varchar2(500 char) NOT NULL,
created_at timestamp NOT NULL,
updated_at timestamp,
PRIMARY KEY ("token")
);
В первом скрипте groovy я делаю вставку в эту таблицу, используя этот фрагмент кода groovy (я опускаю код фрагмента, который устанавливает соединение с базой данных):
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 (я опускаю код фрагмента, который устанавливает соединение с базой данных):
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
и я не понимаю почему..
Может ли кто-нибудь помочь мне решить эту проблему?
Спасибо
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>