使用 jdbc 运行 DB2 命令失败

Posted

技术标签:

【中文标题】使用 jdbc 运行 DB2 命令失败【英文标题】:Failed to run the DB2 command using jdbc 【发布时间】:2020-03-21 18:03:43 【问题描述】:

尝试使用 jdbc 运行 db2 命令。下面是java代码和异常

从coldel0x09修改的del文件中加载db2到item中 代码:

           Connection conn = getConnectionFromDB(); // Connection object
           Statement stmt = conn.createStatement(); //Statement object
           sql = "db2 load from filepath of del modified by coldel0x09 insert into tablename";//command
           System.out.println("Executing command: "+ sql);
           stmt.execute(sql);
        catch (SQLException e) 
           throw new RuntimeException("Error loading into table '" + tableName + "' with SQL: " + sql, e);
       
   

运行命令后出现异常:

原因:com.ibm.db2.jcc.am.SqlSyntaxErrorException:DB2 SQL 错误: SQLCODE=-104,SQLSTATE=42601,SQLERRMC=load;db2;JOIN , 驱动程序=4.9.78 在 com.ibm.db2.jcc.am.fd.a(fd.java:676) 在 com.ibm.db2.jcc.am.fd.a(fd.java:60) 在 com.ibm.db2.jcc.am.fd.a(fd.java:127) 在 com.ibm.db2.jcc.am.en.c(en.java:2553) 在 com.ibm.db2.jcc.am.en.d(en.java:2541) 在 com.ibm.db2.jcc.am.en.b(en.java:1957) 在 com.ibm.db2.jcc.t4.cb.h(cb.java:221) 在 com.ibm.db2.jcc.t4.cb.b(cb.java:47) 在 com.ibm.db2.jcc.t4.q.b(q.java:38) 在 com.ibm.db2.jcc.t4.rb.h(rb.java:114) 在 com.ibm.db2.jcc.am.en.hb(en.java:1952) 在 com.ibm.db2.jcc.am.en.a(en.java:3040) 在 com.ibm.db2.jcc.am.en.e(en.java:1028) 在 com.ibm.db2.jcc.am.en.execute(en.java:1012)

【问题讨论】:

代码不正确。 LOAD 是 Db2-CLP 理解的命令,因此它不是 SQL,因此不能作为 SQL 执行。查找存储过程 ADMIN_CMD ,它只允许您为 Db2-on-Linux/Unix/Windows 执行加载。见ibm.com/support/knowledgecenter/SSEPGG_11.5.0/… 如果您使用的是 Db2 11.5,还可以考虑使用 EXTERNAL TABLE 来加载数据。这是一条 SQL 语句,而不是像 LOAD ibm.com/support/knowledgecenter/en/SSEPGG_11.5.0/… 这样的命令,它也可以加载远程文件,再次与 LOAD 不同 【参考方案1】:

Error -104 是语法错误,“意外令牌”。您要做的是在 JDBC 环境中执行命令行命令。这不是设计使然。

You may want to look into executing LOAD by calling the ADMIN_CMD procedure。 ADMIN_CMD 允许在没有可用命令行界面的情况下运行管理命令。

【讨论】:

阅读我写的。您不能使用该命令,必须使用 ADMIN_CMD 进行切换。查看链接【参考方案2】:

根据data_henkik comment,您的代码应如下所示:

  String storedProcedure = "CALL SYSPROC.ADMIN_CMD('load from [insert full load command here]')";
  CallableStatement cstm = conn.prepareCall(storedProcedure);
  cstm.execute();

【讨论】:

以上是关于使用 jdbc 运行 DB2 命令失败的主要内容,如果未能解决你的问题,请参考以下文章

在 DB2 窗口上使用 JDBC 运行多语句查询

jsp用jdbc连接db2数据库的方法

从spark jdbc连接向数据库发送选项

通过 JDBC 连接到远程 db2 数据库失败

在 Shell 脚本中通过 JDBC 连接到 DB2

怎样确定DB2 JDBC驱动的版本