运行 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 寻求帮助。
我需要使用 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 寻求帮助。