Запуск инструкций IBM Db2 DDL в JDBC

#java #jdbc #db2

Вопрос:

Мне нужно изменить столбец Db2 с помощью JDBC. Столбец может изменить свое имя и/или свой тип. В Db2 эти два действия выполняются в два этапа: первое ИЗМЕНЕНИЕ ТАБЛИЦЫ для изменения имени и второе ИЗМЕНЕНИЕ ТАБЛИЦЫ для изменения типа.

Например:

     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, ДРАЙВЕР=4.27.25

Что означает таблица в «недопустимом состоянии»? Почему таблица находится в таком состоянии? Что не так с этим кодом?

Комментарии:

1. Есть ли ссылка на исходный столбец где-либо, например, в ограничении, определении представления и т. Д.? Что произойдет, если вы сначала измените тип данных, а затем переименуете?

2. Проблема только в одном столбце, если я создам новый столбец, он будет работать нормально. есть какие-нибудь идеи? Я даже перезапустил сервер и все еще получаю эту ошибку «недопустимое состояние», когда пытаюсь переименовать этот конкретный столбец.

3. Опять же, на столбец, который вы изменяете, ссылается ограничение, внешний ключ или определение представления?

4. нет, на это нигде нет ссылок

Ответ №1:

Всегда указывайте свою платформу Db2-сервера (z/os, linux/unix/windows, серия i) и версию Db2-сервера при запросе справки Db2, потому что ответ может зависеть от этих фактов.

Исключение SQL20054N причина 23 означает, что в таблице достигнуто ограничение на количество изменений, и прежде чем продолжить, таблицу необходимо реорганизовать с помощью команды REORG. Документация по ошибке находится здесь. Команда РЕОРГАНИЗАЦИИ вернет таблицу в нормальное состояние. Обычно администратор базы данных рассматривает возможность выполнения команды RUNSTATS после РЕОРГАНИЗАЦИИ, чтобы убедиться, что статистика таблицы обновляется после изменений.

Db2-LUW допускает небольшое количество изменений в таблице (часто 3) перед принудительной реорганизацией для определенных видов изменений. Предыдущие изменения в этой таблице могли быть выполнены другими пользователями в разных транзакциях без получения этого исключения. Инструменты эволюции схемы должны обнаруживать это состояние и восстанавливаться после него.

Это нормальная ситуация, и восстановление заключается в выполнении команды РЕОРГАНИЗАЦИИ.

Вы можете либо попросить администратора базы данных выполнить реорганизацию за вас, либо (если ваш идентификатор авторизации имеет правильные разрешения) из jdbc вызвать хранимую процедуру admin_cmd() для выполнения команды за вас, либо просто использовать интерфейс командной строки Db2 reorg table db.t1 inplace , например . Документация для admin_cmd находится здесь, и если вы не понимаете деталей РЕОРГАНИЗАЦИИ, обратитесь за помощью к администратору базы данных.