【问题标题】:Running IBM Db2 DDL statements in JDBC在 JDBC 中运行 IBM Db2 DDL 语句
【发布时间】:2021-07-10 22:35:28
【问题描述】:

我需要使用 JDBC 更改 Db2 列。该列可能会更改其名称和/或类型。在 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();

例外是:

该操作未执行,因为该表处于无效状态 操作的状态。表名:“DB.T1”。 原因码:“23”.. SQLCODE=-20054, SQLSTATE=55019, DRIVER=4.27.25

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

【问题讨论】:

  • 是否在任何地方引用了原始列,例如在约束、视图定义等中?如果先更改数据类型再重命名会怎样?
  • 问题仅在于一列,如果我创建一个新列,它可以正常工作。有任何想法吗?当我尝试重命名该特定列时,我什至重新启动了服务器并仍然收到此“无效状态”错误。
  • 再次,您正在修改的列是否在约束、外键或视图定义中引用?
  • 不,它没有被任何地方引用

标签: java jdbc db2


【解决方案1】:

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

异常 SQL20054N 原因 23,表示表已达到更改次数限制,在继续之前,需要使用REORG 命令重新组织表。错误的文档是here。 REORG 命令将使表恢复正常状态。通常,DBA 会考虑在 REORG 之后运行 RUNSTATS 命令,以确保在更改后刷新表统计信息。

Db2-LUW 允许在针对某些类型的更改强制重组之前进行少量表更改(通常为 3 次)。以前对该表的更改可能已由其他人在不同的事务中执行,而不会出现此异常。 Schema-evolution 工具应该检测到这种状态并从中恢复。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2013-01-26
    • 2017-10-20
    • 1970-01-01
    • 2014-12-28
    • 2021-01-08
    • 2012-09-08
    • 2011-10-21
    相关资源
    最近更新 更多