簡體   English   中英

更新記錄時缺少右括號 (ORA-00907)

[英]missing right parenthesis (ORA-00907) while updating the record

我正在為缺少括號錯誤而苦苦掙扎。 我的部分代碼如下:

for r in Records:
    update_query = F"UPDATE {Schema}.{table} SET ("
    values_list = list()

    for c, v in zip(columns[1:], val_list[1:]):
        values_list.append(F"{c}={v}")
    update_query += ", ".join(values_list)
    update_query += ") WHERE SOME_ID=:1"
    cursor.execute(update_query, r)

從上面查詢如下:

UPDATE MY_SHEMA.MY_TABLE SET (VAL2=:2, VAL3=:3, VAL4=:4, VAL5=:5, VAL6=:6, VAL7=:7, VAL8=:8, VAL9=:9, VAL10=:10, VAL11=:11, VAL12=:12, VAL13=:13, VAL14=:14, VAL15=:15, VAL16=:16, VAL17=:17) WHERE VAL1=:1

記錄 (r) 如下所示:

[11111, 'some_string', 'some longer string', 4, 'another', 1, '', datetime.datetime(2020, 4, 16, 1, 25, 38), 'some-other-string', 'another string', 7.5, 5.5, 'some:complex/string/with/some/:values', 9.8, 8.5, 'another:complex/string/with/some/:values', datetime.datetime(2020, 11, 4, 17, 43, 23)]

當我插入相似的值時,它工作正常。 我根本無法更新我的記錄。 不知道括號在哪里丟失。 我試圖從SETWHERE之間刪除() 它沒有幫助導致完全相同的錯誤。 我猜它在某種程度上與記錄中的數據類型有關。 然而,不知道為什么它在以類似方式插入時起作用。 其中str_columns is list of all columns value_string is list like [:1,:2,:3...]

SQL = 'insert into ' + Schema + '.' + table + ' (' + str_columns + ') values (' + value_string + ')'
    logger.debug('SQL statement: %s', SQL)
    cursor.executemany(SQL, values, batcherrors=True)

編輯:我在插入記錄時驗證了記錄,並且正在更新記錄。 它們看起來一樣,它們內部有相同的對象,以相同的方式書寫。

我知道這不是用 python 進行數據庫操作的最佳方式。 這是一個非常舊的腳本,我需要修復更新問題。 不打算從頭開始寫。

好的,所以基本上括號不是約翰戈登提到的問題。 一旦我刪除它們,就會出現關於數據不一致的錯誤。 開始挖掘它,我得出結論,創建VALn=:n的循環有問題。 我決定從那里和傳遞給 execute 方法的記錄中刪除 ID 鍵。 我把它保存在一邊並在WHERE子句中使用它。 循環現在看起來如下(添加了 val_list 定義):

##########################
#     Somewhere above    #
##########################
for i in range(1, len(columns)+1):
    val_list.append(':'+ str(i))

#######
#(...)#
#######


for r in Records:
    SOME_ID = r.pop(0)  # Remove some_id from the record. The record is now shorter
    update_query = F"UPDATE {Schema}.{table} SET "
    values_list = list()

    for c, v in zip(columns[1:], val_list[:-1]):  # take column names w/o SOME_ID and one less :n value (as recrod is shorter now)
        values_list.append(F"{c}={v}")

    update_query += ", ".join(values_list)
    update_query += F" WHERE SOME_ID='{SOME_ID}'"
    cursor.execute(update_query, r)

最終結論:我想我對所有這些值和事實感到困惑,我想通過:n從記錄本身傳遞WHERE子句參數。 可能我可以修復我所擁有的,但被卡住並決定嘗試不同的方法。 有用 :)

暫無
暫無

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

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