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)

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

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如何使用位置参数做一些事情,但我现在已经迷失了.

感谢帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,可以实现从 A 数据库中读取表数据分批插入到 B 数据库中: ```python import cx_Oracle import threading # A 数据库连接信息 A_HOST = 'localhost' A_PORT = 1521 A_SID = 'ORCL' A_USER = 'user' A_PASSWORD = 'password' # B 数据库连接信息 B_HOST = 'localhost' B_PORT = 1521 B_SID = 'ORCL' B_USER = 'user' B_PASSWORD = 'password' # 分批读取的大小 BATCH_SIZE = 1000 def read_from_a(start): try: conn_a = cx_Oracle.connect(f'{A_USER}/{A_PASSWORD}@{A_HOST}:{A_PORT}/{A_SID}') cursor_a = conn_a.cursor() cursor_a.execute(f"SELECT * FROM table_a WHERE id >= {start} ORDER BY id ASC") rows = cursor_a.fetchmany(BATCH_SIZE) while rows: insert_to_b(rows) start += BATCH_SIZE rows = cursor_a.fetchmany(BATCH_SIZE) except cx_Oracle.Error as error: print('Error:', error) finally: cursor_a.close() conn_a.close() def insert_to_b(rows): try: conn_b = cx_Oracle.connect(f'{B_USER}/{B_PASSWORD}@{B_HOST}:{B_PORT}/{B_SID}') cursor_b = conn_b.cursor() cursor_b.executemany("INSERT INTO table_b VALUES (:1, :2, :3)", rows) conn_b.commit() except cx_Oracle.Error as error: print('Error:', error) finally: cursor_b.close() conn_b.close() if __name__ == '__main__': start = 0 threads = [] for i in range(10): t = threading.Thread(target=read_from_a, args=(start,)) threads.append(t) t.start() start += BATCH_SIZE for t in threads: t.join() ``` 这个示例代码定义了两个函数,`read_from_a()` 和 `insert_to_b()`,分别用于从 A 数据库中读取数据和向 B 数据库中插入数据。在 `read_from_a()` 函数中,使用 `fetchmany()` 方法分批读取数据,并调用 `insert_to_b()` 函数插入到 B 数据库中。在主函数中创建 10 个线程,每个线程从 A 数据库中读取一批数据并插入到 B 数据库中。 需要注意的是,这个示例代码仅作为参考,具体实现还需要根据实际场景进行调整,例如需要根据数据量大小和系统资源等情况确定分批大小,还需要进行线程间同步和互斥等处理。同时,对于数据库连接等资源,也需要进行合理的管理和释放,以避免资源浪费和泄漏等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值