将数据从SQL server数据库移动到oracle数据库的Python脚本不断给出“ORA-01036:非法变量名称/编号”

将数据从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()

因此,我使用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()
    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()