使用JDBC时db2 load命令失败

使用JDBC时db2 load命令失败,jdbc,db2,db2-luw,Jdbc,Db2,Db2 Luw,我使用JDBC将数据从分隔文件传输到db2数据库表。最初,我遇到了SQLCODE=-104,SQLSTATE=42601,所以在进一步的调试中,我找到了调用存储过程SYSPROC.ADMIN_CMD的方法 我修改了调用并尝试运行过程版本,但仍然收到相同的错误: SqlSyntaxErrorException:db2sql错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=CLIENT;负载从,驱动器=4.26.14 错误| 位于com.ibm.db2.jcc.am.b

我使用JDBC将数据从分隔文件传输到db2数据库表。最初,我遇到了SQLCODE=-104,SQLSTATE=42601,所以在进一步的调试中,我找到了调用存储过程SYSPROC.ADMIN_CMD的方法

我修改了调用并尝试运行过程版本,但仍然收到相同的错误:

SqlSyntaxErrorException:db2sql错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=CLIENT;负载从,驱动器=4.26.14 错误| 位于com.ibm.db2.jcc.am.b7.a(b7.java:810) 错误| 位于com.ibm.db2.jcc.am.b7.a(b7.java:66)

我不确定我到底做错了什么

代码:

调用SYSPROC.ADMIN\u CMD('LOAD CLIENT FROM''OF DEL被COLDEL0X09 INSERT修改为.NONRECOVERABLE')
我在db2命令提示符下运行了LOAD命令,它运行时没有任何问题


Db2版本:11.5

加载客户机命令用于客户机工作站,而不是Db2服务器,因此
sysproc.admin\u cmd
将拒绝客户机关键字

存储过程在Db2服务器上执行,它无权访问存储在客户机工作站上的文件

因此,在
sysproc.admin\u cmd
存储过程的参数中提到的任何文件都必须与Db2服务器文件系统相关,并且Db2实例所有者帐户必须可以访问(可读)

如果数据文件已经位于Db2服务器上,只需引用其完全限定的文件名,并使用
load
命令运行
sysproc.admin\u cmd
过程。仔细检查load命令的文档,以了解使用load的所有含义,特别是在目标Db2服务器高度可用的情况下。这是一个行政问题

如果数据文件尚未位于Db2服务器上,则首先将该文件复制到Db2服务器,然后使用load重试(或更慢的
import

当Db2服务器上的Db2实例所有者可以访问数据文件时,您还可以通过
sysproc.admin\u cmd
运行
import
命令,而不是运行该存储过程

如果您的DB2版本是最近的,您也可以考虑<代码>摄取> /COD>命令,请参阅文档以获取详细信息。

如果您的数据文件位于客户机工作站上,并且您无法或不愿意将其传输到Db2服务器,那么您可以使用本地工作站Db2客户机(如果您安装了包含Db2 CLP的合适Db2客户机)运行脚本/批处理文件以执行相关命令。您不能将jdbc用于该特定目的,尽管您可以从java执行/shell out,在一个脚本中运行所需的命令(
db2 connect to…user…using…
db2 load client…
,或
db2 Inget…
db2 import…

若您的目标Db2服务器已经是11.5或更高版本,那个么它应该支持从外部表和远程外部表插入,因为插入是纯SQL,所以您可以通过jdbc来实现


除上述内容外,大多数DBA都会安排直接的Db2服务器到Db2服务器的传输,如果两者都是Db2 LUW并且具有IP连接,并且如果安全规则允许,这就避免了在Db2之外获取数据的缓慢和不安全的业务。这不是编程问题,而是管理问题。

删除
客户机
ke命令中的yword。@MarkBarinstein如果db2在我的本地计算机上,这可以正常工作。如果db2在远程计算机上,加载的方式应该是什么?这是一个存储过程调用。SP在服务器上运行,正如您所料,如果只能从服务器访问远程计算机上的文件,它可以访问该文件。您可以尝试从远程计算机加载如果您在V11.5,请改为使用外部表。感谢@mao提供详细的回答。在我的情况下,该文件将出现在客户端工作站上。我认为我无法将其传输到服务器。是否有其他方法可以使用JDBC执行数据加载?
CALL SYSPROC.ADMIN_CMD('LOAD CLIENT FROM "<PATH_TO_FILE>" OF DEL MODIFIED BY COLDEL0X09 INSERT INTO <SCHEMA_NAME>.<TABLE_NAME> NONRECOVERABLE')