Обновите отметку времени до текущей отметки времени в DB2, используя пакет Python ibm_db - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь установить последнюю обновленную метку времени в db2 на текущую метку времени каждый раз, когда раздел моего скрипта запускается

datetimes = datetime.now()
datetime1 = datetimes.strftime("%Y-%m-%d  %H:%M:%S")
datetime2 = datetime.strptime(datetime1,'%Y-%m-%d  %H:%M:%S')
print(type(datetime2))
print(datetime2)
sql = "update salesorder set LASTUPDATEUSER = 'Testing' and LASTUPDATEDATETIME = ? where code ='0888' "
prepared = ibm_db.prepare(conn, sql)
returnCode = ibm_db.bind_param(prepared,1,datetime2, ibm_db.SQL_PARAM_INPUT,ibm_db.SQL_CHAR)

if returnCode == False:
    print("unable to bind")
#ibm_db.execute(upstmt)
#param = param1
returnCode = ibm_db.execute(prepared)

if returnCode == False:
    print("unable to execut")

. При запуске этого скрипта я получаю сообщение об ошибке

Traceback (most recent call last):
  File "new.py", line 27, in <module>
    returnCode = ibm_db.execute(prepared)
 SQLCODE=-420atement Execute Failed: [IBM][CLI Driver][DB2/LINUXX8664] SQL0420N  Invalid character found in a character string argument of the function "BOOLEAN".  SQLSTATE=22018

I пробовал несколько разрешений, таких как передача даты и времени в виде строки, но не удалось решить проблему, это формат отметки времени, используемый в db2 '2020-02-21 13:37:37'

Если кто-то может пожалуйста предоставьте способ решить эту проблему, который был бы действительно полезен

1 Ответ

1 голос
/ 11 апреля 2020

Ваше обновление 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

Вы, вероятно, хотите ВСЕГДА ОБЪЕДИНЯТЬСЯ, но я не думаю, что вы можете изменить столбец таким образом , так что вам придется проделать немного больше работы, чтобы добиться этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...