【发布时间】:2021-08-08 08:09:49
【问题描述】:
我正在尝试为两个参数定义一个值列表(id 编号)并将它们传递给查询 Oracle 表的 SQL。
只要我只包含一个 id 和一个参数,这段代码就可以工作
idlist = ['SLCTD']
in_vars = ','.join(':%d' % i for i in range(len(idlist)))
query = """
select PEBEMPL_ECLS_CODE
from PEBEMPL
inner join SPRIDEN on spriden_pidm = pebempl_pidm
where SPRIDEN_CHANGE_IND is null
and SPRIDEN_ID in (%s)
""" % in_vars
df = pd.read_sql(query, connection, params=idlist)
现在已经用两个参数尝试了以下方法,但失败了:
idlist = [735,'SLCTD']
in_vars = ','.join(':%d' % i for i in range(len(idlist)))
query = """
select PEBEMPL_ECLS_CODE
from PEBEMPL
inner join SPRIDEN on spriden_pidm = pebempl_pidm
where SPRIDEN_CHANGE_IND is null
and PLANNING_WEEK in (%s)
and SPRIDEN_ID in (%s)
""" % in_vars
df = pd.read_sql(query, connection, params=idlist)
请指教
【问题讨论】:
-
失败了 - 请粘贴你得到的错误。您的错误与 SQL 无关,字符串格式化失败,因为当有两个占位符时,您只传递了一个参数。所以真正的问题是:如何用两个参数格式化字符串
-
您不能将绑定变量连接成单个绑定变量并将其传递给 oracle 中的 IN 运算符。 IN (:B) 只会考虑整个字符串。如果在 IN 运算符中有多个值,那么每个值都必须作为单独的绑定变量传递。像这样:IN (:B1,:B2,:B3)
-
@koenlosrie 上面的代码应该生成与列表中的元素一样多的未命名变量,因此在
execute中,该语句将有足够的绑定变量来绑定。问题在于字符串插值 -
错误发生在"和 SPIDEN_ID in (%s) """ % in_vars 行。错误消息是“格式字符串的参数不足。”。注意:此查询位于 Python3 脚本中。
-
对于未来的读者,Binding Multiple Values to a SQL WHERE IN Clause 上的 cx_Oracle 文档可能会有用。