异常:[IBM][CLI Driver][DB2/LINUXX8664] SQL0104N 意外令牌错误

Posted

技术标签:

【中文标题】异常:[IBM][CLI Driver][DB2/LINUXX8664] SQL0104N 意外令牌错误【英文标题】:Exception: [IBM][CLI Driver][DB2/LINUXX8664] SQL0104N unexpected token Error 【发布时间】:2020-06-12 22:54:07 【问题描述】:

我有以下数据框

        CALL_DISPOSITION  CITY      END                                     INCIDENT_NUMBER 
0       ADV-Advised       Waterloo  Fri, 23 Mar 2018 01:13:27 GMT           6478983
1       AST-Assist        Waterloo  Sat, 18 Mar 2017 12:41:47 GMT           724030
2       AST-Assist        Waterloo  Sat, 18 Mar 2017 12:41:47 GMT           999000 

我正在尝试将其推送到 IBM DB2 数据库。

我有以下代码:

# IBM DB2 imports
import ibm_db

# instantiate db2 connection
connection_id = ibm_db.connect(
            conn_string,
            '',
            '',
            conn_option,
            ibm_db.QUOTED_LITERAL_REPLACEMENT_OFF)

# create list of tuples from df
records = [tuple(row) for _, row in df.iterrows()]

# Define sql statement structure to replace data into WATERLOO_911_CALLS table
column_names = df.columns
df_sql = "VALUES()".format("?," * (len(column_names) - 1), "?")
sql_command = "REPLACE INTO WATERLOO_911_CALLS  ".format(df_sql)


# Prepare SQL statement 
try:
    sql_command = ibm_db.prepare(connection, sql_command)
except Exception as e:
     print(e)

# Execute query
try:
    ibm_db.execute_many(sql_command, tuple(temp_records))
except Exception as e:
    print('Data pushing error '.format(e))

但是,我不断收到以下错误:

Exception: [IBM][CLI Driver][DB2/LINUXX8664] SQL0104N  An unexpected token "REPLACE INTO WATERLOO_911_CALLS" was found following "BEGIN-OF-STATEMENT".  Expected tokens may include:  "<space>".  SQLSTATE=42601 SQLCODE=-104

我不明白为什么会这样。我按照repo 中概述的步骤操作,但我似乎无法让它工作。我究竟做错了什么?请让我知道我可以做出任何澄清。

【问题讨论】:

Db2 抛出此异常,因为 Db2 没有声明 REPLACE INTO (如其他 RDBMS 提供的)。如果普通的INSERT INTO 不可用,请使用不同的设计,例如插入到临时表或会话表中,然后合并到目标表中。 【参考方案1】:

它提示缺少空格,也许它需要在VALUE() 字符串中的字段之间添加一个。 喜欢df_sql = "VALUES()".format("?, " * (len(column_names) - 1), "?") 而不是df_sql = "VALUES()".format("?," * (len(column_names) - 1), "?")

只是一种预感。 我发现在执行之前打印sql_command 也可以帮助排除故障。

【讨论】:

以上是关于异常:[IBM][CLI Driver][DB2/LINUXX8664] SQL0104N 意外令牌错误的主要内容,如果未能解决你的问题,请参考以下文章

未找到指定的 JDBC 驱动程序 com.ibm.db2.jcc.DB2Driver 类

缺少驱动程序类 com.ibm.db2.jcc.DB2Driver 的依赖关系

与 DB2 和 jdbc 的连接?

Pentaho Spoon 由于缺少驱动程序(jar 文件)而无法连接到 IBM DB2 数据库

ibm_db 在 Python 中使用 SSLClientKeystoredb 连接 DB2

C# ADO.NET IBM DB2 命名参数同名抛出没有足够的参数指定异常