运行 JDBC 中的 IBM Db2 DDL 语句

Running IBM Db2 DDL statements in JDBC

我需要使用 JDBC 更改 Db2 列。该列可能会更改其名称 and/or 其类型。在 Db2 中,这两个操作分两步完成,第一个 ALTER TABLE 更改名称,第二个 ALTER TABLE 更改类型。

例如:

    ALTER TABLE T1 RENAME COLUMN C1 TO C2;
    ALTER TABLE T1 ALTER COLUMN C2 SET DATA TYPE decimal(4,0);

看下面的代码,第一个语句执行了,但第二个语句总是抛出异常。

    String sql = "ALTER TABLE " + tableName + " RENAME COLUMN " + 
                    originalName + " TO " + name;
            
    PreparedStatement ps1 = conn.prepareStatement(sql);
    ps1.executeUpdate();
            
    sql = "ALTER TABLE " + tableName + " ALTER COLUMN " + name + 
                " SET DATA TYPE decimal(" + sc.getLength() + "," + sc.getDec() + ")";

    PreparedStatement ps2 = conn.prepareStatement(sql);
    ps2.executeUpdate();

例外情况是:

The operation was not performed because the table is in an invalid state for the operation. Table name: "DB.T1". Reason code: "23".. SQLCODE=-20054, SQLSTATE=55019, DRIVER=4.27.25

“无效状态”中的 table 是什么意思?为什么 table 处于这种状态?这段代码有什么问题?

在寻求 Db2-help 时,请始终提供您的 Db2-server 平台(z/os、linux/unix/windows、i 系列)和 Db2-server 版本,因为答案可能取决于这些事实。

异常SQL20054N原因23,表示table已达到修改次数限制,在继续之前,table需要用REORG command. The documentation for the error is here. The REORG command will put the table back into a normal state. Normally a DBA would consider running RUNSTATS命令重组遵循 REORG 以确保 table 统计数据在更改后得到刷新。

Db2-LUW 允许进行少量 table 更改(通常为 3 次),然后再针对某些类型的更改强制重组。之前对此 table 的更改可能已由其他人在不同的事务中执行,而没有得到此异常。模式演化工具应检测此状态并从中恢复。

这是正常情况,恢复到运行REORG命令。

您可以要求您的 DBA 为您进行重组,或者您可以(如果您的 authid 具有正确的权限)从 jdbc 调用存储过程 admin_cmd() 来为您执行命令,或者仅使用 Db2 命令行界面 reorg table db.t1 inplace 例如。 admin_cmd 的文档是 here,如果您不了解 REORG 的详细信息,请向您的 DBA 寻求帮助。