我试图定义一个值列表(id 号)并将它们传递给查询 Oracle 表的 SQL。
只要我只包含一个 id,这段代码就可以工作。
named_params = {'ids':'123456548'}
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 :ids
"""
df = pd.read_sql(query, connection, params=named_params)
Run Code Online (Sandbox Code Playgroud)
执行相同操作但传递 id 列表的正确语法是什么?
例如,此代码不起作用:
idlist = ['123456548','546465464']
named_params = {'ids':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 :ids
"""
df = pd.read_sql(query, connection, params=named_params)
Run Code Online (Sandbox Code Playgroud)
返回错误:
': ORA-01484: arrays can only be bound to PL/SQL statements
Run Code Online (Sandbox Code Playgroud)
您需要为列表中的每个项目创建一个单独的绑定参数,然后将 ids 列表传递到read_sql():
idlist = ['123456548','546465464']
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)
Run Code Online (Sandbox Code Playgroud)
为了避免任何混淆,上面的示例使用 Pandasread_sql()函数与 Oracle 进行对话。对于直接使用cursor对象的人来说,语法是:
cursor.execute(query, params)
Run Code Online (Sandbox Code Playgroud)