Muszę zmienić kolumnę DB2 za pomocą JDBC. Kolumna może zmienić jego nazwę i / lub jego typ. W DB2 te dwie akcje są wykonywane w dwóch krokach, pierwsza tabela alter, aby zmienić nazwę, a druga tabela alter, aby zmienić typ.

Na przykład:

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

Patrz poniżej kodu, pierwsze stwierdzenie jest wykonywane, ale drugi zawsze rzuca wyjątek.

    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();

Wyjątkiem jest:

Operacja nie została wykonana, ponieważ tabela jest w nieprawidłowym stanie operacji. Nazwa tabeli: "DB.T1". Kod przyczyny: "23" .. SQLCode = -20054, SQLState = 55019, sterownik = 4.27.25

Jakie jest znaczenie stołu w "Nieprawidłowym stanie"? Dlaczego w tym stanie jest stół? Co jest nie tak z tym kodem?

-1
ps0604 16 kwiecień 2021, 00:11

1 odpowiedź

Najlepsza odpowiedź

Zawsze podaj platformę DB2-Server (Z / OS, Linux / UNIX / Windows, serii I Series) i wersji DB2-Server podczas prośby o pomoc DB2, ponieważ odpowiedź może zależeć od tych faktów.

Wyjątek SQL20054N powodem 23 oznacza, że tabela osiągnęła limit liczby zmian i przed kontynuowaniem, tabela musi być reorganizowana z Reorg polecenie. Dokumentacja błędu jest Oto. Komenda Reorg powstrzyma tabelę z powrotem do stanu normalnego. Zwykle DBA rozważyła bieganie Runstats Polecenie Po reorg, aby upewnić się, że statystyki tabeli są odświeżane zgodnie z zmianami.

DB2-LUW umożliwia niewielką liczbę zmian tabeli (często 3) przed zmuszaniem reorg dla pewnych rodzajów zmian. Poprzednie zmiany tej tabeli mogły zostać wykonane przez innych, w różnych transakcjach, bez uzyskania tego wyjątku. Narzędzia Schema-Evolution powinny wykrywać ten stan i odzyskać od niego.

Jest to normalna sytuacja, a odzyskiwanie jest uruchomienie polecenia Reorg.

Możesz zapytać o DBA do REAG dla Ciebie lub możesz (jeśli Twój autonomiczny ma prawidłowe uprawnienia) z JDBC Zadzwoń do procedury zapisanej admin_cmd() Aby wykonać polecenie dla Ciebie lub po prostu użyj interfejsu wiersza poleceń DB2 reorg table db.t1 inplace na przykład. Dokumentacja admin_cmd jest Oto, a jeśli nie rozumiesz szczegółów Reorg, zapytaj o DBA za pomoc.

2
mao 16 kwiecień 2021, 05:29