Vou tentar explicar minha situação.
Possuo uma Classe Java que cria as tabelas em postgresql.
porém é uma classe que pode ser alterada posteriormente. Caso seja necessária atualização da tabela, como já existem dados salvos não posso apenas dar um drop e recria-la, preciso que ela persista e seja passível de receber uma nova coluna por exemplo. Esta classe que cria a base, estava 100% operacional quando o SGBD era o Firebird, mas a migração fez-se necessária.
Meu problema esta sendo : administrar o valor de retorno do resultset.
para que funcione desta forma : - se tabela não existir (através do select, valor retornado pelo select ) - rs.next (){ entrar no create table} - else (tabela já existe ) entrar nos alter table a fim de realizar atualizações.
Esta seria a forma ideal de execução, porém no código abaixo é entrado nos 2 ifs. Usei o rs.isClosed() para obrigar ele entrar ali. Quando executo pela segunda vez o código ele entra no rs.next(). E quando cai no gerador de FK da uma exceção e cai fora do método, retornando "FK already exists )
Estou tentando explicar da melhor forma possível. O grande problema é deixar esse código fluido, Gostaria de dicas para resolver isto. Estou tentando já alguns dias, mas nenhuma forma funcionou 100% como deveria.
private static void CLIENTES_ALTER_LOG() {
try {
try (Connection conn = Class_Conexao.GetConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT EXISTS (SELECT * FROM pg_tables WHERE schemaname = 'public' AND tablename = 'clientes_alter_log')")) {
if (rs.next()) {
stmt.executeUpdate("CREATE TABLE if not exists CLIENTES_ALTER_LOG ( "
+ "CLIENTE_ALTER_LOG_ID SERIAL PRIMARY KEY, "
+ "CLIENTE_ALTER_LOG_CLI INT NOT NULL, "
+ "CLIENTE_ALTER_LOG_USER INT NOT NULL, "
+ "CLIENTE_ALTER_LOG_DATE TIMESTAMP default current_timestamp NOT NULL, "
+ "CLIENTE_ALTER_LOG_TEXT VARCHAR(10000) NOT NULL)");
stmt.execute("alter table CLIENTES_ALTER_LOG add constraint FK_CLIENTE_ALTER_LOG_CLI foreign key (CLIENTE_ALTER_LOG_CLI) references CLIENTES(CLIENTE_ID)");
stmt.execute("alter table CLIENTES_ALTER_LOG add constraint FK_CLIENTE_ALTER_LOG_USER foreign key (CLIENTE_ALTER_LOG_USER) references USERS(USER_ID)");
System.out.println("CREATE TABLE CLIENTES_ALTER_LOG →");
}
if (rs.isClosed()) {
stmt.execute("ALTER TABLE CLIENTES_ALTER_LOG ADD COLUMN if not exists CLIENTE_ALTER_LOG_CLI INT NOT NULL");
stmt.execute("ALTER TABLE CLIENTES_ALTER_LOG ADD COLUMN if not exists CLIENTE_ALTER_LOG_USER INT NOT NULL");
stmt.execute("ALTER TABLE CLIENTES_ALTER_LOG ADD COLUMN if not exists CLIENTE_ALTER_LOG_DATE TIMESTAMP default current_timestamp NOT NULL");
stmt.execute("ALTER TABLE CLIENTES_ALTER_LOG ADD COLUMN if not exists CLIENTE_ALTER_LOG_TEXT VARCHAR(10000) NOT NULL");
System.out.println("ALTERAR TABELA CLIENTES_ALTER_LOG");
System.out.println("---------------------------------");
}
}
} catch (Exception e) {
System.out.println("\n " + e.getMessage());
}
}