2016-12-12 91 views
0

我打算遍歷一個列表(或字典,其他數據類型,如果適用的話)將每個元素作爲參數傳遞給查詢,以減少每個項目的數據庫讀取時間(< 1500)我想作爲參數傳遞給查詢。我可以在for循環SQL查詢中使用Python列表嗎?

我無法解決cx_Oracle以外的非法變量名稱/數字問題。我已經嘗試了幾種不同的數據類型,甚至在for循環中將其清理爲一個字符串(在下面的註釋中),但每個都向我返回相同的錯誤。

有沒有辦法做到這一點,而不使用IN sql操作符(這是限制在我的數據庫版本的1000個參數)?我是否錯過了一個能夠更有效地做這種事情的模塊?

下面的代碼會導致以下錯誤:

cur2.execute(SQL2, param) 
cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number 

這就是我工作的僞代碼:

#!/usr/bin/python 

import cx_Oracle 

ip = 'my.ip' 
port = 1521 
SID = 'ORADB' 
dsn_tns = cx_Oracle.makedsn(ip, port, SID) 

conn1 = cx_Oracle.connect('un','pw', dsn_tns) 
conn2 = cx_Oracle.connect('un2/[email protected]/target') 

SQL = "SELECT DISTINCT PARAM FROM TABLE" 

if conn1: 
    cur = conn1.cursor() 
    cur.execute(SQL) 
    res = cur.fetchall() 

if conn2: 

    SQL2 = "SELECT * FROM LARGE_TABLE WHERE COLUMN LIKE '%:paramstr%'" 

    realparamlist = list(res) 
    cur2 = conn2.cursor() 
    for param in realparamlist: 
     #eqpstr=str(param) 
     #eqpstr=eqpstr.strip('(').strip(')').strip(',').strip('\'') 

     #cur2.execute(SQL2, eqpstr) 
     cur2.execute(SQL2, param) 
     res2 = cur2.fetchall() 
     print res2 

#todo other things with res2 and res 

cur.close() 
cur2.close() 
conn1.close() 
conn2.close() 

回答

0

您的查詢應該是這樣的,而不是:

SQL2 = "SELECT * FROM LARGE_TABLE WHERE COLUMN LIKE '%' || :paramstr || '%'" 

請注意,無法在引號內找到綁定變量名稱。 Oracle會將它視爲一個字符串,而不是一個綁定變量!

其次,您的參數列表將是一元組列表,這不是您想要的。相反,你應該做這樣的事情,這將解開那些一個元組到值的簡單列表:

realparamlist = [p for p, in res] 

最後,在第二光標執行,你需要這樣的事情,而不是:

cur2.execute(SQL2, paramstr = param) 

希望讓你走!