我正在嘗試通過 Python 在串列上運行 SQL 陳述句。通過傳入一個串列,在這種情況下是日期。因為我想運行多個 SELECT SQL 查詢并回傳它們。我已經通過傳入整數對此進行了測驗,但是在嘗試傳入日期時,我收到了 ORA-01036 錯誤。非法變數名稱/編號。我正在使用 Oracle 資料庫。
cursor = connection.cursor()
date = ["'01-DEC-21'", "'02-DEC-21'"]
sql = "select * from table1 where datestamp = :date"
for item in date:
cursor.execute(sql,id=item)
res=cursor.fetchall()
print(res)
有什么建議可以讓這個運行嗎?
uj5u.com熱心網友回復:
您不能命名系結變數date,這是一個非法名稱。此外,您的命名變數cursor.execute應與系結變數名稱匹配。嘗試類似:
sql = "select * from table1 where datestamp = :date_input"
for item in date:
cursor.execute(sql,date_input=item)
res=cursor.fetchall()
print(res)
uj5u.com熱心網友回復:
對您的方法的一些建議和警告:
在將 a (eg )系結到列時,您不應依賴于默認
NLS日期設定。(您可能還需要 remone 報價之一)。String"'01-DEC-21'"DATE如果您可以在一個查詢中獲取資料(使用串列),則應該省略在回圈中獲取資料
IN使用準備好的陳述句
例子
date = ['01-DEC-21', '02-DEC-21']
這會生成對輸入串列使用系結變數的查詢
in_list = ','.join([f" TO_DATE(:d{ind},'DD-MON-RR','NLS_DATE_LANGUAGE = American')" for ind, d in enumerate(date)])
sql_query = "select * from table1 where datestamp in ( " in_list " )"
將sql_query產生IS
select * from table1 where datestamp in
( TO_DATE(:d0,'DD-MON-RR','NLS_DATE_LANGUAGE = American'), TO_DATE(:d1,'DD-MON-RR','NLS_DATE_LANGUAGE = American') )
請注意,該IN串列為輸入串列的每個成員包含一個系結變數。
還要注意使用to_date 顯式掩碼并修復語言以避免月份縮寫的解釋問題。(例如 ORA-01843: not a valid month)
現在您可以使用查詢一次性獲取資料
cur.prepare(sql_query)
cur.execute(None, date)
res = cur.fetchall()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376660.html
上一篇:用于檢查值是否不存在的SQL查詢
