[当我想将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
在您的代码中,您正在创建一批行,但是随后调用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