Python cx_Oracle。用 executemany() 敲头

标签 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)

(现在转到 session 池守卫,它在下面结束)

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 如何处理位置参数做一些事情,但我现在迷路了。

感谢您的帮助!

最佳答案

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

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

或使用列表:

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

它仅适用于减去 '55' 条目的扁平字符串列表的原因是因为字符串也是序列,但是 '55' 是一个长度序列二。因此,最后一个条目尝试插入两个参数,'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 需要一个序列。

关于Python cx_Oracle。用 executemany() 敲头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20399791/

相关文章:

python - 如何解决 Operand should contain 1 column(s) for update multiple rows in python?

python - psycopg2 executemany 与简单列表?

database - 如何使用 Python3 和 SQlite3 将 3 个列表写入 6 列

python - 关于 sys.exit 和 SystemExit 的混淆

python - MySQL选择字段的元素数

python - 我尝试在 VS code 中安装 cx_Oracle 并收到错误 Microsoft Visual C++ 14.0 或更高版本是必需的

python - 为什么在进行更新时需要显式提交?

python - 统一码编码错误 : 'ascii' codec can't encode character u'\xe9' in position 54: ordinal not in range(128)

python - 在 Python 中将 Unicode 转换为双 ASCII 字母 (ß -> ss)

python - 类型错误 : 'KeysView' object does not support indexing