如何使用python和jdbc驱动程序迭代大型Oracle数据库,并将修改后的记录值存储在另一个表中?

如何使用python和jdbc驱动程序迭代大型Oracle数据库,并将修改后的记录值存储在另一个表中?,python,database,oracle,jdbc,Python,Database,Oracle,Jdbc,我有一个Oracle数据库,有超过500万行,列类型为varchar和blob。为了连接到数据库并读取记录,我使用带有JDBC驱动程序和JayDeBeApi库的python 3.6。我试图做到的是阅读每一行,执行一些 例如,对记录的操作使用正则表达式,然后将新记录值存储在新表中。我不想加载内存中的所有记录,因此我要做的是从数据库中提取它们,存储提取的数据,处理它,然后将其添加到另一个表中。 目前,我一次获取所有记录,例如,先获取1000条记录,然后获取下一个1000条记录,依此类推。这就是我到目

我有一个Oracle数据库,有超过500万行,列类型为varchar和blob。为了连接到数据库并读取记录,我使用带有JDBC驱动程序和JayDeBeApi库的python 3.6。我试图做到的是阅读每一行,执行一些 例如,对记录的操作使用正则表达式,然后将新记录值存储在新表中。我不想加载内存中的所有记录,因此我要做的是从数据库中提取它们,存储提取的数据,处理它,然后将其添加到另一个表中。 目前,我一次获取所有记录,例如,先获取1000条记录,然后获取下一个1000条记录,依此类推。这就是我到目前为止所做的:

statement = "... a select statement..."
connection= dbDriver.connect(jclassname,[driver_url,username,password],jars,)
cursor = connection.cursor()
cursor.execute(statement)
fetched = cursor.fetchall()
for result in fetched:
    preprocess(result)
cursor.close()
如何修改代码以获取结果,以及将第二条语句插入另一个表中的新值放在何处?

正如您所说,在这种情况下,fetchall是一个坏主意,因为它将所有数据加载到内存中

为了避免在光标对象本身上进行迭代,请执行以下操作:

cur.execute("SELECT * FROM test")
for row in cur:  # iterate over result set row by row
    do_stuff_with_row(row)
cur.close()

为什么要使用fetchall而不仅仅是在游标上迭代呢?JDBC有fetchsize的概念,它允许避免加载所有数据。如果您的库允许您在不调用fetchall的情况下迭代游标ie,那么从理论上讲,您应该能够迭代所有条目并进行自己的本地批处理,或者进行最好的逐个处理。JayDeBeApi似乎没有在游标上实现迭代,这是非常不幸的,@IvanVinogradovI会试试的!为了调用新表的insert语句,我可以使用相同的游标对象吗?它不起作用,因为游标对象在jayDeBeeApi实现中不可移植,这很奇怪,因为它们支持,这显然提供了在游标上迭代的工具。下一步,游标。由于我使用python 3.6,我不得不安装JayDeBeApi3,它可能缺少这种实现。我看到的是游标。rs返回一个oracle.jdbc.driver.OracleResultSetImpl@object。