Ваше обновление stmt неверно. Измените:
update salesorder
set LASTUPDATEUSER = 'Testing' and LASTUPDATEDATETIME = ?
where code ='0888'
на:
update salesorder
set LASTUPDATEUSER = 'Testing'
, LASTUPDATEDATETIME = ?
where code ='0888'
или:
update salesorder
set (LASTUPDATEUSER, LASTUPDATEDATETIME) = ('Testing', ?)
where code ='0888'
Полученное сообщение об ошибке озадачивает, но связано с тем, что вы пытаясь вычислить логическое значение из строки:
db2 "values 'testing' and current_timestamp = current_timestamp"
1
--
SQL0420N Invalid character found in a character string argument of the
function "BOOLEAN". SQLSTATE=22018
сравнить с
db2 "values true and current_timestamp = current_timestamp"
1
--
1
, даже если это удастся, вы получите ошибку при попытке присвоить столбцу метки времени логическое значение.
Я полагаю, что более старые версии Db2 возражали бы во время подготовки, но в настоящее время проверка типов гораздо более удобна, что время от времени приводит к очень противоречивым интуитивным сообщениям об ошибках
Тем не менее, вы можете захотеть посмотрите на выполнение:
update salesorder
set (LASTUPDATEUSER, LASTUPDATEDATETIME) = ('Testing', current_timestamp)
where code ='0888'
Ваш код будет тогда уменьшен до:
sql = """update salesorder
set (LASTUPDATEUSER, LASTUPDATEDATETIME) = ('Testing', current_timestamp)
where code ='0888'"""
prepared = ibm_db.prepare(conn, sql)
returnCode = ibm_db.execute(prepared)
if returnCode == False:
print("unable to execut")
Как побочный узел, я нахожу немного громоздким для явного связывания параметров и обычно просто делает:
ibm_db.execute(prepared, (param1, ...))
Если цель состоит в том, чтобы просто обновлять метку времени при изменении строки, запишите триггер:
create trigger trg1
no cascade before update on salesorder
referencing new as n
for each row
set n.LASTUPDATEDATETIME = current_timestamp
Если вы измените оператор обновления на:
update salesorder
set LASTUPDATEUSER = 'Testing'
where code ='0888'
триггер сделает это за вас:
* 103 6 *
В зависимости от вашей версии Db2, вы также можете посмотреть, как объявить столбец:
FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
Вы, вероятно, хотите ВСЕГДА ОБЪЕДИНЯТЬСЯ, но я не думаю, что вы можете изменить столбец таким образом , так что вам придется проделать немного больше работы, чтобы добиться этого.