将数据从SQL server数据库移动到oracle数据库的Python脚本不断给出“ORA-01036:非法变量名称/编号”
因此,我使用python从sql server中提取数据,并使用一个简单的选择来获取15列。数据如下所示将数据从SQL server数据库移动到oracle数据库的Python脚本不断给出“ORA-01036:非法变量名称/编号”,python,sql,oracle,Python,Sql,Oracle,因此,我使用python从sql server中提取数据,并使用一个简单的选择来获取15列。数据如下所示 2016-06-01 05:45:06.003,5270,240,1,1,0,5000,1,null,null,7801009661561,0,null,null,null try: cnn = cx_Oracle.connect(user="####", password = "####", dsn = "####") trgtcrsr = cnn.cursor()
2016-06-01 05:45:06.003,5270,240,1,1,0,5000,1,null,null,7801009661561,0,null,null,null
try:
cnn = cx_Oracle.connect(user="####", password = "####", dsn = "####")
trgtcrsr = cnn.cursor()
print "Connected to Oracle"
except Exception as e:
print e
raise RuntimeError("Could not connect to Oracle")
oracle表上的列都是数字,但第一列是日期。尺寸都正确
获取所有数据后,我通过这个小函数运行它,以摆脱pyodbc.row类型
def BuildBindList(recordsToWrite):
closingRecords = []
for rec in recordsToWrite:
closingRecords.append((rec[0], rec[1], rec[2], rec[3], rec[4], rec[5], rec[6], rec[7], rec[7], rec[8], rec[9], rec[10], rec[11], rec[12], rec[13], rec[14]))
return closingRecords
我得到一个元组列表
然后为了写入oracle表,我编写了这个函数,它接受元组列表
def write_to_table(recordsToWrite):
SQL = '''INSERT INTO ####### (DATETIME, ID, TZ, DOMAINID, EVENTNAME, REASONCODE, TARGETID, STATE, KEY, PERIPHERALKEY, RECOVERYKEY, DIRECTION, ROUTERDAY, ROUTERCKEY, ROUTERNUMBER)
VALUES(:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15)'''
try:
trgtcrsr.prepare(SQL)
except cx_Oracle.DatabaseError, exception:
print ('Failed to prepare cursor')
print Exception(exception)
exit (1)
try:
trgtcrsr.executemany(None, recordsToWrite)
except cx_Oracle.DatabaseError, exception:
print ('Failed to insert rows')
print Exception(exception)
exit (1)
target_connection .commit()
target_connection .close()
我这样做oracle连接
2016-06-01 05:45:06.003,5270,240,1,1,0,5000,1,null,null,7801009661561,0,null,null,null
try:
cnn = cx_Oracle.connect(user="####", password = "####", dsn = "####")
trgtcrsr = cnn.cursor()
print "Connected to Oracle"
except Exception as e:
print e
raise RuntimeError("Could not connect to Oracle")
连接工作正常。但是,当执行行trgtcrsr.executemanyNone、recordsToWrite时,会出现“ORA-01036:非法变量名/编号”错误
我有另一个脚本,它使用与trgtcrsr.prepareSQL/trgtcrsr.executemanyNone、recordsToWrite方法相同的方法将元组列表写入oracle表,并且它工作正常,允许oracle向oracle写入,因此我不确定为什么会不断出现此错误。我尝试过改变数据类型并用谷歌搜索错误,但找不到类似的结果
有什么想法吗?rec[7]在函数BuildBindList中出现两次
我猜这会导致insert失败,因为您在insert语句中传递了16列来实例化15个bind变量。无法插入的记录值是什么?@Daniel它没有告诉我。@bernie不是元组列表还是元组容器?@JohnGordon您说得很对。但是表名包含我没有包含的标识信息,这就是为什么在绑定列表中两次获得you have rec[7]的原因。。可能是列数不匹配。我觉得自己太傻了,没注意到这一点。非常感谢,这解决了问题。
**#PYTHON SCRIPT TO COPY DATA FROM ORACLE TO SQL SERVER**
import cx_Oracle
import pyodbc
#Server Variables
orServer = '10.xxx.x.xxx'
orPort = 'xxxx'
orService = 'MYSERV'
orUser = 'ORMYUSER'
orPassword = 'orpassword'
sqlServer = 'SQLSERVER'
sqlDatabase = 'MYDB'
#SQL Server Connection
sqlConn = pyodbc.connect('Driver={SQL Server};'
'Server='+sqlServer+';'
'Database='+sqlDatabase+';'
'Trusted_Connection=yes;')
sqlCursor = sqlConn.cursor()
#Oracle Connection
dsn_tns = cx_Oracle.makedsn(orServer, orPort, service_name= orService )
orConn = cx_Oracle.connect(user= orUser, password= orPassword, dsn=dsn_tns)
orCursor = orConn.cursor()
#Get data from Oracle Server
orCursor.execute("""SELECT ID
,NAME
,SEX
,ADDRESS
PHONE
FROM DetailsTable"""
)
orColumns =['ID',
'NAME',
'SEX',
'ADDRESS',
'PHONE']
#Creating Strings for insert statement to load data into SQL Server
cValues = str(orColumns).replace("[","(").replace("]",")").replace("'","")
x = len(orColumns)
i = 0
ab = []
while i < x:
i = i+ 1
ab.append("?")
values = str(ab).replace("[","(").replace("]",")").replace("'","")
#Load data to SQL server
sqlCursor.executemany("INSERT INTO [MYDB].[dbo].[DetailsTable]"+ cValues+ " VALUES "+ values ,orCursor)
sqlConn.commit()
sqlConn.close()
orConn.close()