暂无图片
如何用python执行批量把A库的数据插入到B库中
我来答
分享
Edward
2022-05-08
如何用python执行批量把A库的数据插入到B库中

把oracle数据库中的A库的CT_CUS_PAYITEMSCATE_INIT表同步到B库中的CT_CUS_PAYITEMSCATE_INIT,想通过insert into select方式实现
按照下面的代码执行后,提示Exception Traceback (most recent call last) File OraclePreparedStatementWrapper.java:221, in oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject() File OraclePreparedStatement.java:8370, in oracle.jdbc.driver.OraclePreparedStatement.setObject() File OraclePreparedStatement.java:8395, in oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal() File OraclePreparedStatement.java:7639, in oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal() File OraclePreparedStatement.java:7708, in oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical() File OraclePreparedStatement.java:4889, in oracle.jdbc.driver.OraclePreparedStatement.setStringInternal() Exception: Java Exception The above exception was the direct cause of the following exception: java.sql.SQLException Traceback (most recent call last) e:\222\导入基础资料\未命名5.ipynb Cell 1' in <cell line: 36>() 34 sqlInsert=sqlInsert+" Values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" 35 #cursTo.execute(sqlInsert,value) ---> 36 cursTo.executemany(sqlInsert,resultFrom) File d:\Programs\Python\Python\lib\site-packages\jaydebeapi\__init__.py:549, in Cursor.executemany(self, operation, seq_of_parameters)

...

521 for i in range(len(parameters)): 522 # print (i, parameters[i], type(parameters[i])) --> 523 prep_stmt.setObject(i + 1, parameters[i]) java.sql.SQLException: java.sql.SQLException: 无效的列索引

import sys

import os

import jaydebeapi


url = 'jdbc:oracle:thin:@8.142.180.78:1521:MAEASDB'

driver = 'oracle.jdbc.driver.OracleDriver'

userFrom = 'test'

passwordFrom = 'test'

jarFile = 'D:/Tools/JDBC/ojdbc8.jar'

connFrom = jaydebeapi.connect(jclassname=driver,

                          url=url,

                          driver_args=[userFrom, passwordFrom],

                          jars=jarFile)

cursFrom = connFrom.cursor()

userTo = 'MAEAS'

passwordTo = 'MAEAS'

jarFile = 'D:/Tools/JDBC/ojdbc8.jar'

connTo = jaydebeapi.connect(jclassname=driver,

                          url=url,

                          driver_args=[userTo, passwordTo],

                          jars=jarFile)

cursTo = connTo.cursor()

sqlStr = 'select FREGIONCODE, FCATEGORYNUMBER, FCATEGORYNAME, FCATEGORYSUBCODE, FCATEGORYSUBNAME, FPAYITEMNUMBER, FPAYITEMNAME, FPAYITETYPE, FCATEGORYID, FCATEGORYSUBID from CT_CUS_PAYITEMSCATE_INIT'

cursFrom.execute(sqlStr)

resultFrom = cursFrom.fetchall()

#cursTo.execute(sqlStr)

#result = cursFrom.fetchall()

#value=()

#for i in range(len(resultFrom)):

#    cursTo = connTo.cursor()

#    value=(resultFrom[i])

   # print(value)

sqlInsert="insert into CT_CUS_PAYITEMSCATE_INIT (FREGIONCODE, FCATEGORYNUMBER, FCATEGORYNAME, FCATEGORYSUBCODE, FCATEGORYSUBNAME, FPAYITEMNUMBER, FPAYITEMNAME, FPAYITETYPE, FCATEGORYID, FCATEGORYSUBID)"

sqlInsert=sqlInsert+" Values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"

#cursTo.execute(sqlInsert,value)

cursTo.executemany(sqlInsert,resultFrom)

#connTo.commit()

#cursTo.execute(sqlStr)

#resultTo = cursFrom.fetchall()

#print(sqlInsert)

查询了字段的个数都是相同的,没有找到问题在那里?


我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
严少安
暂无图片

java.sql.SQLException: 无效的列索引

换个思路,resultFrom查询出来的结果有不是10个值的么?

暂无图片 评论
暂无图片 有用 0
Edward
题主
2022-05-08
改成循环的形式还是提示错误
Edward
题主
2022-05-12
1、如果使用cursTo.executemany(sqlInsert,resultFrom) 方法在oracle下就报错,怀疑是在PreparedStatement阶段不识别这种写法。 因为提示 521 for i in range(len(parameters)): 522# print (i, parameters[i], type(parameters[i])) --> 523prep_stmt.setObject(i + 1, parameters[i]) java.sql.SQLException: java.sql.SQLException: 无效的列索引 看源代码520行像数据准备的代码 def _set_stmt_parms(self, prep_stmt, parameters): for i in range(len(parameters)): # print (i, parameters[i], type(parameters[i])) prep_stmt.setObject(i + 1, parameters[i]) def execute(self, operation, parameters=None): if self._connection._closed: raise Error() if not parameters: parameters = () self._close_last() self._prep = self._connection.jconn.prepareStatement(operation) self._set_stmt_parms(self._prep, parameters) try: is_rs = self._prep.execute() except: _handle_sql_exception() if is_rs: self._rs = self._prep.getResultSet() self._meta = self._rs.getMetaData() self.rowcount = -1 else: self.rowcount = self._prep.getUpdateCount() # self._prep.getWarnings() ??? def executemany(self, operation, seq_of_parameters): self._close_last() self._prep = self._connection.jconn.prepareStatement(operation) for parameters in seq_of_parameters: self._set_stmt_parms(self._prep, parameters) self._prep.addBatch() update_counts = self._prep.executeBatch() # self._prep.getWarnings() ??? self.rowcount = sum(update_counts) self._close_last() 如果改成一行行的插入,即执行execute方法,就不会报错。只是不能一次性把数据插入
Edward

resultfrom 是个列表,在变量查看中显示的
image.png

改成如下:

cursTo = connTo.cursor()

value=()

for i in range(len(resultFrom)):

#    value=(resultFrom[i])

# print(value)

sqlInsert=“insert into CT_CUS_PAYITEMSCATE_INIT (FREGIONCODE, FCATEGORYNUMBER, FCATEGORYNAME, FCATEGORYSUBCODE, FCATEGORYSUBNAME, FPAYITEMNUMBER, FPAYITEMNAME, FPAYITETYPE, FCATEGORYID, FCATEGORYSUBID)”

sqlInsert=sqlInsert+" Values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"

#cursTo.execute(sqlInsert,value)

cursTo.executemany(sqlInsert,resultFrom)

connTo.commit()

错误提示一致

Output exceeds the size limit. Open the full output data in a text editor

---------------------------------------------------------------------------

Exception Traceback (most recent call last) File OraclePreparedStatementWrapper.java:221, in oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject**()** File OraclePreparedStatement.java:8370, in oracle.jdbc.driver.OraclePreparedStatement.setObject**()** File OraclePreparedStatement.java:8395, in oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal**()** File OraclePreparedStatement.java:7639, in oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal**()** File OraclePreparedStatement.java:7708, in oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical**()** File OraclePreparedStatement.java:4889, in oracle.jdbc.driver.OraclePreparedStatement.setStringInternal**()** Exception: Java Exception The above exception was the direct cause of the following exception: java.sql.SQLException Traceback (most recent call last) d:\C\jdbc-query.ipynb Cell 1’ in <cell line: 30>() 34 sqlInsert=sqlInsert+" Values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" 35 #cursTo.execute(sqlInsert,value) —> 36 cursTo.executemany(sqlInsert,resultFrom) 37 connTo.commit()

[521](file:///d%3A/Programs/Python/Python/lib/site-packages/jaydebeapi/init.py?line=520) for i in range(len(parameters)): [522](file:///d%3A/Programs/Python/Python/lib/site-packages/jaydebeapi/init.py?line=521) # print (i, parameters[i], type(parameters[i])) –> [523](file:///d%3A/Programs/Python/Python/lib/site-packages/jaydebeapi/init.py?line=522) prep_stmt.setObject(i + 1, parameters[i]) java.sql.SQLException: java.sql.SQLException: 无效的列索引

暂无图片 评论
暂无图片 有用 0
严少安
2022-05-12
所以可能是jaydebeapi的问题了?去他们官网问过么
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏