如何在cx_Oracle查询的IN子句中传递多个变量?
cx_Oracle 多值IN查询解决方案
方案1:数组绑定 + = ANY 操作符
cx_Oracle支持将Python列表/元组作为数组绑定到单个变量,只需把IN (:alist)替换为= ANY (:alist)即可:
target_list = ('12345a', '12345b') cursor.execute(''' select A.NUMBER, A.NAME from table_a A where A.NUMBER = ANY (:alist) ''', alist=target_list) results = cursor.fetchall()
方案2:动态生成绑定占位符
如果偏好原生IN语法,可根据值的数量动态生成对应占位符,再传入参数元组:
target_list = ('12345a', '12345b') # 生成与值数量匹配的占位符,如两个值对应":1,:2" placeholders = ', '.join([f':{i+1}' for i in range(len(target_list))]) sql = f''' select A.NUMBER, A.NAME from table_a A where A.NUMBER in ({placeholders}) ''' cursor.execute(sql, target_list) results = cursor.fetchall()
注意事项
- 方案1无需拼接SQL,能避免SQL注入风险,是cx_Oracle推荐的多值查询方式。
- 方案2通过动态生成绑定占位符而非直接拼接值,同样能保证安全性,逻辑更贴近Oracle原生写法。
内容的提问来源于stack exchange,提问作者LynChen
相关产品推荐
相关产品推荐

