You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 22:45:07