cx_Oracle.NotSupportedError:pyodbc.Row类型的Python值不支持

问题描述 投票:0回答:1

[当我想将ETL从SQL Server转换为Oracle时,请使用以下代码。实际上我使用了进程和线程,但是我的代码抛出了错误。执行后,错误为cx_Oracle.NotSupportedError: Python value of type pyodbc.Row not supported。你能帮我吗?

import cx_Oracle
import sys
import pyodbc

BYTES_PER_BATCH = 1024 *256  

# Oracle connection
connection_12c=cx_Oracle.connect()
cur_12c = connection_12c.cursor()
# SQL Server Connection
conn_str = (
        'DRIVER={driver;'
        'SERVER=IP:PORT;'
        'DATABASE=DBNAME;'
        'UID=user;'
        'PWD=pass'
    )
cnxn = pyodbc.connect(conn_str)
cur = cnxn.cursor()
query = """SELECT Id, OpTime,  GidenData , Action FROM table """
cur.execute(query)
    # Id number
    # Optime Datetime
    # gidendata clob
cur_batch = []
cur_size = 0
for result in cur.fetchall():
    cur_batch.append(result)
    cur_size += sys.getsizeof(result)
    if cur_size > BYTES_PER_BATCH:
        cur_12c.execute("""insert into oracle_table (Id,OpTime,GidenData,Action) values (: 1  ,: 2  ,: 3  ,: 4 ) """,cur_batch)
        cur_batch = []
        cur_size = 0
python sql-server pyodbc cx-oracle
1个回答
0
投票

在您的代码中,您正在创建一批行,但是随后调用cursor.execute()只会插入一行!由于Oracle还支持带有数据数组的PL / SQL,因此cx_Oracle假定您传递的是pyodbc.Row对象数组,它不知道如何处理。相反,您只需要将cur_12c.execute()更改为cur_12c.executemany()。然后cx_Oracle将处理一个行数组-我相信这是您想要的。

import cx_Oracle
import sys
import pyodbc

BYTES_PER_BATCH = 1024 *256  

# Oracle connection
connection_12c=cx_Oracle.connect()
cur_12c = connection_12c.cursor()
# SQL Server Connection
conn_str = (
        'DRIVER={driver;'
        'SERVER=IP:PORT;'
        'DATABASE=DBNAME;'
        'UID=user;'
        'PWD=pass'
    )
cnxn = pyodbc.connect(conn_str)
cur = cnxn.cursor()
query = """SELECT Id, OpTime,  GidenData , Action FROM table """
cur.execute(query)
    # Id number
    # Optime Datetime
    # gidendata clob
cur_batch = []
cur_size = 0
for result in cur.fetchall():
    cur_batch.append(result)
    cur_size += sys.getsizeof(result)
    if cur_size > BYTES_PER_BATCH:
        cur_12c.executemany("""insert into oracle_table (Id,OpTime,GidenData,Action) values (: 1  ,: 2  ,: 3  ,: 4 ) """,cur_batch)
        cur_batch = []
        cur_size = 0
© www.soinside.com 2019 - 2024. All rights reserved.