Python cx_Oracle。用executemany敲打头()

时间:2013-12-05 12:15:19

标签: python cx-oracle executemany

我昨天大部分时间都在这里和网络上查看问题并且仍然无法找出我所缺少的内容。我很确定它必须是非常愚蠢的东西,但我现在已经烧坏了。

所以,代码:

temp_table_name = 'COMPTEMP.i'+todo_name+'_MSGRUN'
sql_create_table = "CREATE TABLE "+temp_table_name+" (CL VARCHAR2(255)) NOLOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING"
DB_GATEWAY.execute(sql_create_table)

(创建好了)

sql_fill_table_header = """INSERT INTO """+temp_table_name+""" (CL) VALUES (:1)"""
sql_fill_table_build = []
sql_fill_table_build = ['1', '2', '3', '4', '55']

DB_GATEWAY.executemany(sql_fill_table_build, sql_fill_table_header)

(现在转到会话池守卫,最终在下面)

def executemany( self, db_operation, db_prepare ):
    self.cursor_.prepare(db_prepare)
    self.cursor_.executemany(None, db_operation)

运行时,我得到了一个错误的错误

OracleException:  ORA-01036: illegal variable name/number

如果我从列表中删除值“55”,其他所有其他内容都会被正确插入,所以它看起来只接受1个字符长度的值。

当我通过execute()单独运行每个语句时,它们会被插入。我很确定它必须对代码或Oracle如何使用位置参数做一些事情,但我现在已经迷失了。

感谢帮助!

1 个答案:

答案 0 :(得分:3)

executemany()需要一系列;列表中的条目本身必须是参数序列,即使插入的行只包含一个值:

sql_fill_table_build = [('1',), ('2',), ('3',), ('4',), ('55',)]

或使用列表:

sql_fill_table_build = [['1'], ['2'], ['3'], ['4'], ['55']]

它仅使用平面字符串减去'55'条目的原因是因为字符串也是序列,但'55'是长度为2的序列。因此,最后一个条目尝试插入两个参数'5''5',但您的查询只需要一个参数。

如果某些API只为您提供了一个平面列表,您可以将平面列表转换为嵌套序列,并在插入时使用列表解析:

DB_GATEWAY.executemany(sql_fill_table_build, [(v,) for v in sql_fill_table_header])

我没有使用cx_Oracle对此进行测试,但是某些数据库适配器也接受迭代,因此生成器表达式可能更有效:

DB_GATEWAY.executemany(sql_fill_table_build, ((v,) for v in sql_fill_table_header))

但可能cx_Oracle需要一个序列。