通过Java执行Snowflake COPY命令无报错但数据未加载如何解决
问题原因及解决方法
核心根因
你现在的代码主要存在两个基础错误:
- 执行COPY INTO这类DML操作误用了
executeQuery()方法:该方法仅用于执行返回结果集的查询语句(如SELECT),执行DML操作应该用execute()或executeUpdate()方法 - JDBC连接默认未开启自动提交,执行完COPY命令后没有主动提交事务,数据变更会直接回滚,而Snowflake控制台默认是自动提交事务,所以执行后能正常写入
修复后的代码示例
Connection connection = DriverManager.getConnection(connectionUrl, _connectionProperties); // 方案1:开启自动提交,无需手动commit connection.setAutoCommit(true); Statement statement = connection.createStatement(); // 使用execute执行COPY命令 boolean hasResult = statement.execute("copy into TESTTABLE (id, name) from (select $1, $2 from @mystage/F.csv.gz t);"); // 读取返回结果确认加载行数 if(!hasResult) { int affectedRows = statement.getUpdateCount(); System.out.println("成功加载行数:" + affectedRows); } /* 方案2:不开启自动提交的话,执行完成后手动提交 connection.setAutoCommit(false); statement.execute("copy into TESTTABLE (id, name) from (select $1, $2 from @mystage/F.csv.gz t);"); connection.commit(); */ connection.close();
其他排查点
如果修改后还是没有数据,可以按顺序排查:
- 确认Java连接使用的数据库、Schema、角色和控制台一致,TESTTABLE最好写全限定名,例如
YOUR_DB.PUBLIC.TESTTABLE,避免写到其他Schema的同名表 - 排查重复加载问题:Snowflake默认会记录已加载过的文件,相同文件如果之前已经加载成功过,不会重复加载,可以在COPY命令末尾加
FORCE=TRUE参数强制加载测试 - 完整读取COPY命令的返回结果,确认是否存在字段类型不匹配、文件格式不符等加载错误,这类问题不会抛出SQL异常,只会在返回结果里展示失败信息
内容的提问来源于stack exchange,提问作者Asraar Wani
相关产品推荐
相关产品推荐

