如何在Python编写的Oracle查询中使用列表参数
报错原因
你触发ORA-00936: missing expression报错的核心原因是直接将Python列表格式化到SQL语句中:Python列表的默认字符串表示会携带[]方括号,最终生成的SQL语句会变成STATE in (['AL', 'GA', 'TN']),而Oracle的IN子句要求的是逗号分隔的不带方括号的表达式集合,语法不匹配就会触发报错。
此外直接用format拼接SQL还存在SQL注入风险,更推荐使用参数绑定的方式实现列表参数传值。
正确实现方式
方法1:动态参数绑定(推荐,安全无SQL注入风险)
Oracle支持位置/命名占位符,我们可以根据列表长度动态生成对应数量的占位符,再将列表作为参数传入执行,完全避免字符串拼接的风险:
import cx_Oracle SOUTHERN_STATE = ["AL", "GA", "TN", "FL"] # 按列表长度生成对应数量的Oracle位置占位符,格式为:1, :2, :n placeholders = ', '.join(f':{idx+1}' for idx in range(len(SOUTHERN_STATE))) query = f""" SELECT * FROM USERS WHERE STATE in ({placeholders}) """ # 连接Oracle执行查询,直接将列表作为参数传入execute方法 conn = cx_Oracle.connect("your_username/your_password@host:port/service_name") cursor = conn.cursor() cursor.execute(query, SOUTHERN_STATE) result = cursor.fetchall() # 用完关闭连接 cursor.close() conn.close()
方法2:手动格式化字符串(仅适用于列表内容为完全可控的常量场景)
如果能100%确定列表内容没有用户输入、不存在注入风险,可以手动将列表元素拼接为符合Oracle IN子句语法的格式:
SOUTHERN_STATE = ["AL", "GA", "TN", "FL"] # 给每个元素加单引号,再用逗号拼接 state_params = ', '.join(f"'{state}'" for state in SOUTHERN_STATE) query = f""" SELECT * FROM USERS WHERE STATE in ({state_params}) """
警告:如果列表内容包含用户可控的输入,严禁使用该方法,会导致严重的SQL注入漏洞。
内容的提问来源于stack exchange,提问作者Jack Smith
相关产品推荐
相关产品推荐

