UPDATE em mais de uma tabela ao mesmo tempo

10 respostas
P

Olá pessoal,

Preciso fazer mais de um UPDATE no mesmo método... só que está dando erro:
ERRO: duplicar valor da chave viola a restrição de unicidade "conta_pkey"

Método:
public boolean simCardUpdateTelecom(String simCard, String linha,
			int apnUtilizada, String conta, int operadora, String plano,
			int statusSIMCard, Date dtAtivacao, int fonte, int statusLinha,
			String imsi, String consumoDados) {
		boolean atualiza = false;
		Connection conn = null;
		PreparedStatement co = null;
		PreparedStatement pl = null;
		PreparedStatement li = null;
		PreparedStatement sc = null;

		try {
			
			conn = ConnectionManager.obterConexao();
			co = conn.prepareStatement(SQL_SIMCARD_UPDATE_CONTA);
			co.setString(1, conta);
			co.setTimestamp(2,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			co.setString(3, simCard);
			co.executeUpdate();

			pl = conn.prepareStatement(SQL_SIMCARD_UPDATE_PLANO);
			pl.setString(1, conta);
			pl.setString(2, plano);
			pl.setTimestamp(3,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			pl.setString(4, simCard);
			pl.executeUpdate();

			li = conn.prepareStatement(SQL_SIMCARD_UPDATE_LINHA);
			li.setString(1, linha);
			li.setInt(2, statusLinha);
			li.setString(3, conta);
			li.setDate(4, new java.sql.Date((dtAtivacao).getTime()));
			li.setTimestamp(5,
					new java.sql.Timestamp(new java.util.Date().getTime()));
			li.setString(6, simCard);
			li.executeUpdate();

			sc = conn.prepareStatement(SQL_SIMCARD_UPDATE_SIMCARD);
			sc.setString(1, simCard);
			sc.setInt(2, CodigoProcessamento());
			sc.setString(3, linha);
			sc.setInt(4, statusSIMCard);
			sc.setInt(5, apnUtilizada);
			sc.setInt(6, operadora);
			sc.setString(7, imsi);
			sc.setString(8, consumoDados);
			sc.setDate(9, new java.sql.Date((dtAtivacao).getTime()));
			sc.setString(10, simCard);
			sc.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnectionManager.fecharConexao(conn, null, co);
			ConnectionManager.fecharConexao(conn, null, pl);
			ConnectionManager.fecharConexao(conn, null, li);
			ConnectionManager.fecharConexao(conn, null, sc);
		}

		return atualiza;
	}

Estou fazendo junto, porque tenho que fazer uma consulta antes para ver se já possui cadastro nas tabelas Linha e conta...

10 Respostas

Henrique_Moraes

Poste o seu código SQL amigo…

P

Segue os códigos de UPDATE

private static final String SQL_SIMCARD_UPDATE_CONTA = "UPDATE conta SET Numero = (?::varchar)::numeric, DataAlteracao = ?"
			+ "FROM simcard, linha, plano "
			+ "WHERE simcard.numeroLinha = Linha.numero "
			+ "AND conta.numero = linha.numeroConta "
			+ "AND conta.numero = plano.numeroConta "
			+ "AND simcard.numero = (?::varchar)::numeric";
	
private static final String SQL_SIMCARD_UPDATE_PLANO = "UPDATE plano SET NumeroConta = (?::varchar)::numeric, Nome = (?::varchar), DataAlteracao = ? "
			+ "FROM simcard, conta, linha "
			+ "WHERE simcard.numeroLinha = linha.numero "
			+ "AND conta.numero = linha.numeroConta "
			+ "AND conta.numero = plano.numeroConta "
			+ "AND simcard.numero = (?::varchar)::numeric";
	
private static final String SQL_SIMCARD_UPDATE_LINHA = "UPDATE linha SET Numero = (?::varchar)::numeric, CodigoStatusLinha = (?::integer), NumeroConta = (?::varchar)::numeric, DataAtivacao = (?::date), DataAlteracao = ? "
			+ "FROM simcard, plano, conta "
			+ "WHERE simcard.numeroLinha = linha.numero "
			+ "AND conta.numero = linha.numeroConta "
			+ "AND conta.numero = Plano.numeroConta "
			+ "AND simcard.numero = (?::varchar)::numeric";
	
private static final String SQL_SIMCARD_UPDATE_SIMCARD = "UPDATE SIMCard SET Numero = (?::varchar)::numeric, CodigoProcessamento = (?::integer), NumeroLinha = (?::varchar)::numeric, CodigoStatusSIMCard = (?::integer), CodigoAPNProvisionada = (?::integer), CodigoOperadora = (?::integer), IMSI = (?::varchar)::numeric, ConsumoDados = (?::varchar), DataAlteracao = ? "
			+ "FROM conta, plano, linha "
			+ "WHERE simcard.numeroLinha = linha.numero "
			+ "AND conta.numero = Plano.numeroConta "
			+ "AND conta.numero = linha.numeroConta " 
			+ "AND simcard.numero = (?::varchar)::numeric";
Henrique_Moraes

Quais os campos que são chaves primárias na tabela Conta?

P

Só a número

P

Nobody ???

Isso ta tenso de eu resolver…

Henrique_Moraes

é por isso, você está alterando um valor que é chave primária, e com certeza esse valor já existe em outro registro, e chave primária não permite valores duplicados. Entendeu?

P

Então Henrique esse é meu problema…
Mas eu faço UPDATE em todas as tabelas que possui ela (PK), mas se executo no SQL beleza, mas quando tento fazer pelo java da esse erro…

Eu até coloquei comk os comandos BEGIN e COMMIT:

private static final String SQL_SIMCARD_UPDATE = "BEGIN; " + "UPDATE conta SET Numero = (?::varchar)::numeric, DataAlteracao = ? FROM simcard, linha, plano WHERE simcard.numeroLinha = Linha.numero AND conta.numero = linha.numeroConta AND conta.numero = plano.numeroConta AND simcard.numero = (?::varchar)::numeric; " + "UPDATE plano SET Codigo = (SELECT MAX(plano.codigo + 1) FROM plano), NumeroConta = (?::varchar)::numeric, Nome = (?::varchar), DataAlteracao = ? FROM simcard, conta, linha WHERE simcard.numeroLinha = linha.numero AND conta.numero = linha.numeroConta AND conta.numero = plano.numeroConta AND simcard.numero = (?::varchar)::numeric; " + "UPDATE linha SET Numero = (?::varchar)::numeric, CodigoStatusLinha = (?::integer), NumeroConta = (?::varchar)::numeric, DataAtivacao = (?::date), DataAlteracao = ? FROM simcard, plano, conta WHERE simcard.numeroLinha = linha.numero AND conta.numero = linha.numeroConta AND conta.numero = Plano.numeroConta AND simcard.numero = (?::varchar)::numeric; " + "UPDATE SIMCard SET Numero = (?::varchar)::numeric, CodigoProcessamento = (?::integer), NumeroLinha = (?::varchar)::numeric, CodigoStatusSIMCard = (?::integer), CodigoAPNProvisionada = (?::integer), CodigoOperadora = (?::integer), IMSI = (?::varchar)::numeric, ConsumoDados = (?::varchar), DataAlteracao = ? FROM conta, plano, linha WHERE simcard.numeroLinha = linha.numero AND conta.numero = Plano.numeroConta AND conta.numero = linha.numeroConta AND simcard.numero = (?::varchar)::numeric; " + "COMMIT;";

Henrique_Moraes

O erro tá acontecendo quando vc dá o update na tabela conta. Já verificou se o where só retorna um único registro ?

P

sim… quando executo no sql (todas de uma só vez) funciona…

P

Acho que descobri a causa do problema…

Acho que ele da erro quando a conta já está gravada em outro registro…
Exemplo:

conta 123 já gravada
entra um novo registro (que é verificado pelo simcard) e com essa conta… só que quando ele tenta atualizar com a condição do simcard, ele da erro dizendo que já está relacionada com outro registro…

A dúvida agora é… como eu resolvo isso??

Criado 29 de outubro de 2012
Ultima resposta 29 de out. de 2012
Respostas 10
Participantes 2