【问题标题】:Java Runtime Execute SQL script continue on SQL errorJava 运行时执行 SQL 脚本继续 SQL 错误
【发布时间】:2020-01-14 13:01:47
【问题描述】:

我们正在尝试编写一个执行产品升级步骤的 java 代码。其中一个步骤是调用一个执行 sql 脚本文件。

我们正在使用 java 运行时进程执行器来调用 sql 脚本。 有时当产品在升级之前打补丁时,已经创建了几个通过 sql 脚本创建的表。 并且流程执行失败并出现表已存在错误。

我们希望该过程不会因任何与 SQL 相关的错误而失败,而是继续执行下一条语句(类似于使用 mysql 控制台调用 sql 脚本时的行为)。

我们已经尝试过,但找不到解决方案。如果可能以及如何实现,请帮助我们?

这是 SQL 脚本的启动方式:


USE iiq;

create table iiq.spt_monitoring_statistic(
id varchar(32) not null,
name varchar(255),
created bigint,
modified bigint,
operation varchar(255),
source varchar(255),

调用流程的代码:

    Process p;
    Runtime rt = Runtime.getRuntime();

    String c4 = "cmd /c cd "+input_Map.get("DBServerHome")+"/bin"+" && 
    echo exit | mysql -u "+UpgradeRequest.dbUser+" - 
    p"+UpgradeRequest.dbPass+" < " +'"'+iiq_dir+"/identityiq/WEB- 
    INF/database/upgrade_product_tables.mysql"+'"';

    p=rt.exec(c4);

    stdout = new BufferedReader(new InputStreamReader(
                         p.getInputStream()));
            String line;
            while ((line = stdout.readLine()) != null) {
                log.warn(line);
            }

我遇到的错误:

第 11 行的错误 1050 (42S01):表 'spt_monitoring_statistic' 已经存在

编辑:更改 sql 脚本会很困难,因为它是产品升级包的一部分,而这不是我们的产品。我们只是升级相同。我们只是想以某种方式忽略错误并使处理转到下一行。如果我们使用 mysql 控制台运行 sql 脚本,它会显示错误,但会继续下一行并执行它们。我们可以使用 java 运行时以某种方式做同样的事情吗?

谢谢

【问题讨论】:

    标签: java mysql sql process runtime


    【解决方案1】:

    使用不同的表名,因为错误清楚地表明具有上述名称的表已经存在。

    【讨论】:

    • 您好,谢谢。更改 sql 脚本会很困难,因为它是产品升级包的一部分。我们只是想以某种方式忽略错误并使处理转到下一行。如果我们使用 mysql 控制台运行 sql 脚本,它会显示错误,但会继续下一行并执行它。我们可以使用 java 运行时以某种方式做同样的事情吗?
    【解决方案2】:

    第 11 行的错误 1050 (42S01):表 'spt_monitoring_statistic' 已经存在

    这意味着该表已经存在于您的数据库中,并且您多次执行此查询。

    你应该添加IF NOT EXISTS:

    CREATE TABLE IF NOT EXISTS iiq.spt_monitoring_statistic(
    id varchar(32) not null,
    name varchar(255),
    created bigint,
    modified bigint,
    operation varchar(255),
    source varchar(255),
    

    或者删除第一个表然后执行上面的查询:

    DROP TABLE iiq.spt_monitoring_statistic
    

    如果您想创建多个表,请按照@Himanshu 所说的更改表名

    【讨论】:

    • 您好,谢谢。更改 sql 脚本会很困难,因为它是产品升级包的一部分。我们只是想以某种方式忽略错误并使处理转到下一行。如果我们使用 mysql 控制台运行 sql 脚本,它会显示错误,但会继续下一行并执行它。我们可以使用 java 运行时以某种方式做同样的事情吗?
    • @user3008362 如果您想忽略错误并让处理转到下一行,请用try{...}catch(Exception e){} 语句包围您的查询代码
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2014-08-17
    • 1970-01-01
    相关资源
    最近更新 更多