使用 Python 将值列表传递给 Oracle

Dre*_*ead 5 python oracle

我试图定义一个值列表(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)

Wil*_*ing 7

您需要为列表中的每个项目创建一个单独的绑定参数,然后将 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)