我搜索了 stackoverflow、“ASK TOM”和 oracle 论坛,但找不到解决我的问题的方法。 我试图根据表中是否存在键来更新或插入表。即使删除所有括号后,我仍然得到“右括号缺失”。 下面是代码: 我将 csv 文件读入 pandas 数据框,然后将 np.nan 更改为 ''。
import pandas as pd
import numpy as np
import cx_Oracle
CONNECT_DEV = '/@HISTORICAL_DEV'
master_airtempclimo = pd.read_csv('/home/milstedl/JMCLIM/master_airtempclimo_FINAL_PYTHON.csv')
master_airtempclimo.replace(np.nan, '', regex=True, inplace=True)
dev_connect = cx_Oracle.connect(CONNECT_DEV)
dev_cursor = dev_connect.cursor()
sql = '''merge into jm_admin.jmm_airtempclimo a
using (select LOCATIONID, PERIODID, MONTH, NAME, ORGANIZATIONID, VERSION
from dual) d
on (a.LOCATIONID = d.LOCATIONID, a.PERIODID = d.PERIODID, a.MONTH = d.MONTH, a.NAME = d.NAME,
a.ORGANIZATIONID = a.ORGANIZATIONID, a.VERSION = d.VERSION)
when matched then update set a.TEMPERATURESAMPLESIZE = :TEMPERATURESAMPLESIZE, a.DENSITYMEAN = :DENSITYMEAN,
a.TEMPERATUREDEWPOINTSAMPLESIZE = :TEMPERATUREDEWPOINTSAMPLESIZE, a.HUMIDITYSAMPLESIZE = :HUMIDITYSAMPLESIZE,
a.TEMPERATUREMEAN = :TEMPERATUREMEAN, a.TEMPERATUREDEWPOINTMEAN = :TEMPERATUREDEWPOINTMEAN,
a.PRESSUREVAPORMEAN = :PRESSUREVAPORMEAN, a.TEMPERATURESTANDARDDEVIATION = :TEMPERATURESTANDARDDEVIATION,
a.TEMPERATUREDEWPOINTSTDDEV = :TEMPERATUREDEWPOINTSTDDEV, a.DENSITYSTANDARDDEVIATION = :DENSITYSTANDARDDEVIATION,
a.TEMPERATUREMAXIMUM = :TEMPERATUREMAXIMUM, a.TEMPERATUREDEWPOINTMAXIMUM = :TEMPERATUREDEWPOINTMAXIMUM,
a.HUMIDITYRELATIVEMAXIMUM = :HUMIDITYRELATIVEMAXIMUM, a.HUMIDITYABSOLUTEMAXIMUM = :HUMIDITYABSOLUTEMAXIMUM,
a.HUMIDITYSPECIFICMAXIMUM = :HUMIDITYSPECIFICMAXIMUM, a.TEMPERATUREMINIMUM = :TEMPERATUREMINIMUM,
a.TEMPERATUREDEWPOINTMINIMUM = :TEMPERATUREDEWPOINTMINIMUM, a.HUMIDITYRELATIVEMINIMUM = :HUMIDITYRELATIVEMINIMUM,
a.HUMIDITYABSOLUTEMINIMUM = :HUMIDITYABSOLUTEMINIMUM, a.HUMIDITYSPECIFICMINIMUM = :HUMIDITYSPECIFICMINIMUM,
a.TEMPERATUREMAXIMUMMEAN = :TEMPERATUREMAXIMUMMEAN, a.TEMPERATUREMINIMUMMEAN = :TEMPERATUREMINIMUMMEAN,
a.HUMIDITYRELATIVEMAXIMUMMEAN = :HUMIDITYRELATIVEMAXIMUMMEAN, a.HUMIDITYRELATIVEMINIMUMMEAN = :HUMIDITYRELATIVEMINIMUMMEAN,
a.TEMPERATUREMAXIMUMRANGE = :TEMPERATUREMAXIMUMRANGE, a.TEMPERATUREMINIMUMRANGE = :TEMPERATUREMINIMUMRANGE
when not matched then insert (LOCATIONID, PERIODID, MONTH, NAME, ORGANIZATIONID, VERSION, TEMPERATURESAMPLESIZE, DENSITYMEAN, TEMPERATUREDEWPOINTSAMPLESIZE, HUMIDITYSAMPLESIZE, TEMPERATUREMEAN, TEMPERATUREDEWPOINTMEAN, PRESSUREVAPORMEAN, TEMPERATURESTANDARDDEVIATION, TEMPERATUREDEWPOINTSTDDEV, DENSITYSTANDARDDEVIATION, TEMPERATUREMAXIMUM, TEMPERATUREDEWPOINTMAXIMUM, HUMIDITYRELATIVEMAXIMUM, HUMIDITYABSOLUTEMAXIMUM, HUMIDITYSPECIFICMAXIMUM, TEMPERATUREMINIMUM, TEMPERATUREDEWPOINTMINIMUM, HUMIDITYRELATIVEMINIMUM, HUMIDITYABSOLUTEMINIMUM, HUMIDITYSPECIFICMINIMUM, TEMPERATUREMAXIMUMMEAN, TEMPERATUREMINIMUMMEAN, HUMIDITYRELATIVEMAXIMUMMEAN, HUMIDITYRELATIVEMINIMUMMEAN, TEMPERATUREMAXIMUMRANGE, TEMPERATUREMINIMUMRANGE)
values (:LOCATIONID, :PERIODID, :MONTH, :NAME, :ORGANIZATIONID, :VERSION, :TEMPERATURESAMPLESIZE, :DENSITYMEAN, :TEMPERATUREDEWPOINTSAMPLESIZE, :HUMIDITYSAMPLESIZE, :TEMPERATUREMEAN, :TEMPERATUREDEWPOINTMEAN, :PRESSUREVAPORMEAN, :TEMPERATURESTANDARDDEVIATION, :TEMPERATUREDEWPOINTSTDDEV, :DENSITYSTANDARDDEVIATION, :TEMPERATUREMAXIMUM, :TEMPERATUREDEWPOINTMAXIMUM, :HUMIDITYRELATIVEMAXIMUM, :HUMIDITYABSOLUTEMAXIMUM, :HUMIDITYSPECIFICMAXIMUM, :TEMPERATUREMINIMUM, :TEMPERATUREDEWPOINTMINIMUM, :HUMIDITYRELATIVEMINIMUM, :HUMIDITYABSOLUTEMINIMUM, :HUMIDITYSPECIFICMINIMUM, :TEMPERATUREMAXIMUMMEAN, :TEMPERATUREMINIMUMMEAN, :HUMIDITYRELATIVEMAXIMUMMEAN, :HUMIDITYRELATIVEMINIMUMMEAN, :TEMPERATUREMAXIMUMRANGE, :TEMPERATUREMINIMUMRANGE)
'''
try:
for index, row in master_airtempclimo.iterrows():
dev_cursor.execute(sql, {"LOCATIONID": row['LOCATIONID'], "PERIODID": row['PERIODID'],
"MONTH": row['MONTH'], "NAME": row['NAME'], 'ORGANIZATIONID': row['ORGANIZATIONID'],
'VERSION': row['VERSION'], 'TEMPERATURESAMPLESIZE': row['TEMPERATURESAMPLESIZE'],
'DENSITYMEAN': row['DENSITYMEAN'], 'TEMPERATUREDEWPOINTSAMPLESIZE': row['TEMPERATUREDEWPOINTSAMPLESIZE'],
'HUMIDITYSAMPLESIZE': row['HUMIDITYSAMPLESIZE'], 'TEMPERATUREMEAN': row['TEMPERATUREMEAN'],
'TEMPERATUREDEWPOINTMEAN': row['TEMPERATUREDEWPOINTMEAN'], 'PRESSUREVAPORMEAN': row['PRESSUREVAPORMEAN'],
'TEMPERATURESTANDARDDEVIATION': row['TEMPERATURESTANDARDDEVIATION'],
'TEMPERATUREDEWPOINTSTDDEV': row['TEMPERATUREDEWPOINTSTDDEV'],
'DENSITYSTANDARDDEVIATION': row['DENSITYSTANDARDDEVIATION'], 'TEMPERATUREMAXIMUM': row['TEMPERATUREMAXIMUM'],
'TEMPERATUREDEWPOINTMAXIMUM': row['TEMPERATUREDEWPOINTMAXIMUM'],
'HUMIDITYRELATIVEMAXIMUM': row['HUMIDITYRELATIVEMAXIMUM'],
'HUMIDITYABSOLUTEMAXIMUM': row['HUMIDITYABSOLUTEMAXIMUM'],
'HUMIDITYSPECIFICMAXIMUM': row['HUMIDITYSPECIFICMAXIMUM'], 'TEMPERATUREMINIMUM': row['TEMPERATUREMINIMUM'],
'TEMPERATUREDEWPOINTMINIMUM': row['TEMPERATUREDEWPOINTMINIMUM'],
'HUMIDITYRELATIVEMINIMUM': row['HUMIDITYRELATIVEMINIMUM'],
'HUMIDITYABSOLUTEMINIMUM': row['HUMIDITYABSOLUTEMINIMUM'],
'HUMIDITYSPECIFICMINIMUM': row['HUMIDITYSPECIFICMINIMUM'],
'TEMPERATUREMAXIMUMMEAN': row['TEMPERATUREMAXIMUMMEAN'], 'TEMPERATUREMINIMUMMEAN': row['TEMPERATUREMINIMUMMEAN'],
'HUMIDITYRELATIVEMAXIMUMMEAN': row['HUMIDITYRELATIVEMAXIMUMMEAN'],
'HUMIDITYRELATIVEMINIMUMMEAN': row['HUMIDITYRELATIVEMINIMUMMEAN'],
'TEMPERATUREMAXIMUMRANGE': row['TEMPERATUREMAXIMUMRANGE'],
'TEMPERATUREMINIMUMRANGE': row['TEMPERATUREMINIMUMRANGE']
})
except Exception as exception:
print('Error, ', exception)
exit()
else:
dev_connect.commit()
我确信我在 sql 中做错了什么,但不知道是什么。 任何帮助将不胜感激。
你有:
on (a.LOCATIONID = d.LOCATIONID, a.PERIODID = d.PERIODID, a.MONTH = d.MONTH, a.NAME = d.NAME,
a.ORGANIZATIONID = a.ORGANIZATIONID, a.VERSION = d.VERSION)
ON
子句类似于 WHERE
子句,使用 AND
语句而不是逗号来获取复合参数。将这些逗号替换为 AND
即可解决您遇到的错误。