2016-12-12 67 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) 

希望让你走!