DatabaseError:ORA-00928:缺少SELECT关键字

时间:2017-11-29 14:03:38

标签: oracle dataframe insert cx-oracle

我是一名新的甲骨文学习者。我正在尝试将一个pandas数据帧插入到oracle表中。我已经在网上进行了研究,代码本身(https://www.snip2code.com/Snippet/704409/Insert-pandas-dataframe-to-Oracle-databa/)应该非常简单,但我不知道为什么我的代码不起作用。

我已从本地文件中读取了pandas数据框:

import cx_Oracle
import pandas as pd
import os

dir_path = os.path.dirname(os.path.realpath("__file__"))
df = pd.read_csv(dir_path+"/sample.csv")

现在打印df,数据帧df shold如下:

   DATE            YEAR     MONTH      SOURCE      DESTINATION
0  11/1/2017 1:00  2017     1          AL          CO  
1  11/2/2017 1:00  2017     5          GA          ID  
2  11/3/2017 1:00  2017     12         GA          MO    

然后我使用cx_Oracle创建与数据库的连接。接下来,我尝试将数据帧df插入到表TEST中。此表TEST是一个空表,已存在于oracle数据库中,它包含oracle中的DATE,YEAR,MONTH,SOURCE,DESTINATION等列。所有数据类型都与df的数据匹配。我的代码如下:

conn_str = u'account/password@host:1521/server'
conn = cx_Oracle.connect(conn_str)
cur = conn.cursor()

# Write records stored in a DataFrame to a oracle database
rows = [tuple(x) for x in df.values]
print(rows)
cur.executemany('''INSERT INTO TEST (DATE,YEAR,MONTH,SOURCE,DESTINATION) 
                   VALUES (:1,:2,:3,:4,:5)''',rows)

conn.commit()
conn.close()

显示错误:

  

DatabaseError:ORA-00928:缺少SELECT关键字

如何解决问题?非常感谢你的时间!

1 个答案:

答案 0 :(得分:1)

DATE是Oracle SQL中的保留字。您需要引用它(或将列重命名为非保留字的内容)。 YEAR也是一个保留词,需要相同的处理。

insert into test("DATE", ...

当这样引用时,大小写必须与表定义中使用的大小写匹配。

保留字词和关键字的完整列表:Oracle (12c) SQL Reserved Words and Keywords