簡體   English   中英

使用 Python ibm_db package 將時間戳更新為 DB2 中的當前時間戳

[英]Update the timestamp to current timestamp in DB2 using Python ibm_db package

每次我的腳本部分運行時,我都試圖將 db2 中的 lastupdated 時間戳設置為當前時間戳

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

我嘗試了多種解決方案,例如將日期時間作為字符串傳遞,但沒有解決問題,這是 db2 '2020-02-21 13:37:37' 中使用的時間戳格式

如果有人可以請提供一種解決此問題的方法,這將非常有幫助

您的更新 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'

您收到的錯誤消息令人費解,但這是因為您嘗試從字符串中評估 Boolean:

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

即使成功,您在嘗試為時間戳列分配 boolean 值時也會出錯。

我猜舊版本的 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'

觸發器將為您執行此操作:

db2 "select * from salesorder"

LASTUPDATEUSER       LASTUPDATEDATETIME         CODE 
-------------------- -------------------------- -----
Testing              2020-04-11-11.51.22.055602 0888 

  1 record(s) selected.

./aa.py

db2 "select * from salesorder"

LASTUPDATEUSER       LASTUPDATEDATETIME         CODE 
-------------------- -------------------------- -----
Testing              2020-04-11-11.58.50.222753 0888 

  1 record(s) selected.

根據您的 Db2 版本,您還可以考慮將列聲明為:

FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP

您可能希望始終生成,但我認為您不能將列更改為該列,因此您必須做更多的工作才能將其落實到位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM