如何将值列表作为绑定变量传入Python OracleDB游标的IN子句查询
实现Python OracleDB游标绑定列表到IN子句的两种方法
Oracle数据库无法直接将Python列表作为单个绑定变量传入IN子句,以下是两种安全且高效的实现方式:
方法一:使用MEMBER OF操作符(推荐,Oracle 12c+)
这是最符合Oracle绑定变量最佳实践的方式,驱动会自动处理列表到Oracle集合类型的转换。
步骤1:修改query.sql的SQL语句
SELECT * FROM table WHERE column1 MEMBER OF (:VALUE);
步骤2:Python执行代码
import oracledb from pathlib import Path # 替换为实际数据库信息 user = "你的用户名" password = "你的密码" dsn = "你的数据库DSN" # 待传入的数值列表 list_of_values = ["value1", "value2", "value3"] with oracledb.connect(user=user, password=password, dsn=dsn) as connection, \ open(Path("./adhoc_sqls/query.sql").resolve(), "r", encoding="utf-8") as sql_file: cursor = connection.cursor() sql_query = sql_file.read() # 直接将列表作为绑定变量传入,参数名对应SQL中的:VALUE cursor.execute(sql_query, VALUE=list_of_values) # 获取并处理查询结果 for row in cursor.fetchall(): print(row)
方法二:动态生成绑定占位符(兼容旧版本Oracle)
如果你的Oracle版本不支持MEMBER OF,可通过动态生成与列表长度匹配的绑定占位符来实现。
步骤1:修改query.sql的基础模板
SELECT * FROM table WHERE column1 IN ({PLACEHOLDERS});
步骤2:Python执行代码
import oracledb from pathlib import Path # 替换为实际数据库信息 user = "你的用户名" password = "你的密码" dsn = "你的数据库DSN" # 待传入的数值列表 list_of_values = ["value1", "value2", "value3"] # 生成对应数量的绑定占位符,如":1, :2, :3" placeholders = ", ".join([f":{i+1}" for i in range(len(list_of_values))]) # 读取基础SQL并替换占位符 with open(Path("./adhoc_sqls/query.sql").resolve(), "r", encoding="utf-8") as sql_file: sql_query = sql_file.read().format(PLACEHOLDERS=placeholders) with oracledb.connect(user=user, password=password, dsn=dsn) as connection: cursor = connection.cursor() # 将列表直接传入,驱动会按顺序匹配占位符 cursor.execute(sql_query, list_of_values) # 获取并处理查询结果 for row in cursor.fetchall(): print(row)
关键注意事项
- 禁止直接将列表元素拼接进SQL字符串(如
','.join(list_of_values)),这会引发SQL注入风险,且无法利用数据库缓存提升性能。 - 若使用旧版驱动
cx_Oracle,上述代码仅需将oracledb替换为cx_Oracle即可正常运行。 - 若你的代码实际使用ODBC连接Oracle,方法二同样适用,只需调整连接方式为
odbc.connect,绑定变量的传入逻辑保持不变。
内容的提问来源于stack exchange,提问作者Praveen Mishra
相关产品推荐
相关产品推荐

