Problema estranho ao Inserir Registro

Pessoal, sempre tabalhei com BD Oracle, está acontecendo algo muito estranho, pois montei uma simples rotina de inserção e ao executar não dá erro nenhum, executa normalmente meu INSERT, mas vou no BD e o registro não está na tabela, não foi inserido. O que será isso ?? pq, todos INSERt q fiz até hoje funcionou normalmente !!!

Valew.

não dá erro nenhum?

Você fez isso em outros bancos de dados, ou no Oracle mesmo?

Por default o Oracle tem autoCommit definido em false. Então, você deve dar um commit no banco para o registro aparecer.

Veja o método setAutoCommit() e o método commit() da classe Connection. Ou configure o seu banco de dados para dar auto commit. Numa dessas o problema é só esse! :wink:

Não dá erro algum, ele executa tudo de cabo a rabo !!! o único problema é não não aparecece o registro depois !!!

[quote=ViniGodoy]Você fez isso em outros bancos de dados, ou no Oracle mesmo?

Por default o Oracle tem autoCommit definido em false. Então, você deve dar um commit no banco para o registro aparecer.

Veja o método setAutoCommit() e o método commit() da classe Connection. Ou configure o seu banco de dados para dar auto commit. Numa dessas o problema é só esse! ;)[/quote]

Eu só trabalho com Oracle.

O estranho é que outros métodos insert no mesmo projeto, inserem os registros normalmente na tabela!!! Mas se falando de commit, como eu poderia implementar algo do tipo pra fazer uns teste ???

Valew.

1 - que ferramenta tu ta usando pra visualizar os registros no oracle?

2 - qdo vc abre a ferramenta pela primeira vez o registro nao ta… ai vc fexa e abre de novo o registro ta la… acontece isso?

[quote=fabiocsi]1 - que ferramenta tu ta usando pra visualizar os registros no oracle?
[/quote]

Uso o PL/SQL Developer

Não, posso abrir e fechar que o registro não aparece !!!

Sinistro!!!

Uma vez um colega nosso estava se matando com um problema parecido com esse até que a gente reparou que ele estava com o PL/SQL Developer apontando para um servidor e a string de conexão do programa apontando para outro servidor Oracle - nosso ambiente tinha vários servidores, alguns para desenvolvimento, outros para homologação.

Isso verifiquei tb, mas to no BD certo, pois a cada vez que tento inserir, ele incrementa a sequence usada para a PK da tabela !!!

Fiz um teste aqui e olha que coisa estranha.

após eu executar a Query (sql.executeUpdate()) eu coloquei para imprimir:

System.out.println("sql = "+sql.executeUpdate());

foi impresso “sql = 0”

Olha só!! fiz o mesmo teste num insert q funciona e veja o retorno: “sql = 1”

O q significa isso ?

meu método:

public String getAprovar() throws SQLException, Exception {
		Conexao cnct = new Conexao();
		try {
			PreparedStatement  	sql, sql_op, sql_ls, sql_in	= null;
			ResultSet 			rs 							= null;
			String 				operacao					= null;
			String 				tipo						= null; //Tipo Limite Aprovação			
			int 				tabela_base;
			cnct.conecta();					      
	        
	        if (id_historico != null){
				for (int i=0;i<id_historico.length;i++){
					
					sql_op = cnct.conn.prepareStatement
		        		("SELECT wi.operacao, " +
		        		 "		 hw.id_tabela_base, " +
		        		 "		 hw.chave " +
		        	     "  FROM workflow_item wi, " +
		        	     "       historico_workflow hw " +
		        	     " WHERE wi.id_workflow_item = hw.id_workflow_item " +
		        	     "   AND hw.id_historico_workflow = ? ");
					sql_op.setString(1, id_historico[i]);					
					rs = sql_op.executeQuery(); 					

			        if(rs.next()){
			        	operacao 	= rs.getString(1);
			        	tabela_base = rs.getInt(2);
			        	chave		= rs.getString(3);
			        	
			        	if(tabela_base == 7){ //Tabela Limite de Crédito
				        	
			        		if(operacao.equals("V")){
				        		tipo = "R";
				        	}else if(operacao.equals("A")){
				        		tipo = "A";
				        	}
			        		
			        		if(limite_aprovado == null){
				        		sql_ls = cnct.conn.prepareStatement
			        			       ("SELECT To_Char(Decode(ls.valor_aprovado,0, "+
			        			        "		     							Decode(ls.valor_recomendado,0,ls.valor_solicitado, "+
			        			        "																	  ls.valor_recomendado), "+ 
			        			        "										ls.valor_aprovado), 'FM999G999G990D00','NLS_Numeric_characters=,.' " +
			        			        "		)Limite_solicitado, "+
			        			        "		Decode(Decode(ls.situacao_aprovada,0,ls.sequencial_situacao_cliente, "+
			        			        "                         					 ls.situacao_aprovada),null, "+
			        			        "                                            0,  "+
			        			        "                                            Decode(ls.situacao_aprovada,0,ls.sequencial_situacao_cliente, "+
			        			        "                                                                          ls.situacao_aprovada)" +
			        			        "		)Situacao_solicitada "+
			        			        "  FROM limite_solicitacao ls " +
			        			       	" WHERE ls.id_limite_solicitacao = ?");
				        		sql_ls.setString(1, chave);
				        		rs = sql_ls.executeQuery();
	
				        		if(rs.next()){
				        			limite_aprovado 	= rs.getString(1).replace("." , "");
				        			situacao_aprovada 	= rs.getString(2);
				        		}
				        		
				        		sql_ls.close();
				        		rs.close();
			        		}		        		
			        		
			        		cnct.conn.setAutoCommit(true);
			        		sql_in = cnct.conn.prepareStatement
			        			  ("INSERT INTO limite_aprovacao( " +
			        			   " 			id_limite_aprovacao, " +
			        			   "			id_limite_solicitacao, " +
			        			   "			data, " +
			        			   "			usuario, " +
			        			   "			tipo, " +
			        			   "			observacoes, " +
			        			   "			valor_aprovacao, " +
			        			   "		    sequencial_situacao_cliente, " +
			        			   "			id_historico_workflow ) " +
			        			   "	VALUES( " +
			        			   "			sq_limite_aprovacao.nextval, " +
			        			   "			?, " +
			        			   "			Sysdate, " +
			        			   "			?, " +
			        			   "			?, " +
			        			   "			?, " +
			        			   "			?, " +
			        			   "			?, "+ 
			        			   "			?)");
			        		sql_in.setString(1, chave);
			        		sql_in.setString(2, usuario);
			        		sql_in.setString(3, tipo);
			        		sql_in.setString(4, observacao_workflow);
			        		sql_in.setString(5, limite_aprovado);
			        		sql_in.setString(6, situacao_aprovada);
			        		sql_in.setString(7, id_historico[i]);
			        		sql_in.executeUpdate();
			        		
			        		System.out.println("sql_in = "+sql_in.executeUpdate());
			        		
			        		sql_op.close();
			        		sql_in.close();
			        		
			        	}
			        	
			        	sql = cnct.conn.prepareStatement("UPDATE historico_workflow SET " +
					       "data_resposta = sysdate, resposta = ? WHERE id_historico_workflow = ?");
			        	sql.setString(1, operacao);	
			        	sql.setString(2, id_historico[i]);
			        	sql.executeUpdate();
			        	System.out.println("sql = "+sql.executeUpdate());
			        	sql.close();
			        }
					
				}
			}	    
			
			
		} 
		catch (SQLException sqle) {
			System.out.println(sqle.getMessage());
			sqle.printStackTrace();
			throw new java.sql.SQLException(sqle.getMessage());
		}
		catch (Exception e) {
			System.out.println(e.getMessage());
			throw new Exception(e.getMessage());
		}
		finally {		        
			try{
		    	 cnct.conn.close();
		    	 //pool.close();
		     }
		     catch(Exception e){e.printStackTrace();}
	    }
		return "";
	}

E os premios ‘Metodo Mais Longo’ e ‘Metodo Com Mais Strings Literais Concatenadas’ vai para…

Isso tem cara de código gerado.

Quanto ao problema, vivi situação parecida com o que thingol falou. O servidor fora do ar pra todo mundo e pra mim funcionando.

E a falta de comunicação não durou muito tempo :mrgreen:

Ih cara, isso é o padrão aqui na empresa, onde toda instrução SQL tem que ficar 1 campo, tabela, condição,etc por linha!!! por isso fica meio extenso.

Pq vc não aprovitou sua piadinha e já dava uma dica pra resolver o problema ???

[color=red]Obervação: [/color] Se o pessoal fosse mais objetivo nas resposta, diminuiria em 50% de post no fórum, ao invés disso o pessoal fica criticando, puxando assunto nada haver com a pergunta e fazendo piadinhas.

Ok, vamos ao problema:

observe em

                  rs = sql_op.executeQuery(); 

depois veja:

                    if(rs.next()){

e lá embaixo, temos:


      rs = sql_ls.executeQuery();
    
                                if(rs.next()){

vai dando CTRL+F nos trechos que te falei.

Observe que você está usando o mesmo ResultSet, o atributo “rs”, um dentro do outro (em termos de escopo / laço).

Não tenho o menor conhecimento sobre seu método, mas uma coisa que precisamos manter em código-fonte é coesão: não aproveite variáveis pra fazer duas coisas, você pode se dar mal.

T+

Proteu, declarei rs distinto para cada sql, mas continuou a mesma coisa.

Em relação ao teste q fiz vom o System.out.println("sql = "+sql.executeUpdate()); onde no método comproblema é impresso “0” e testando em um método q tá funcionando retorna “1” vc sabe me dizer o q é ?

Returns:
either the row count for INSERT, UPDATE or DELETE statements, or 0 for SQL statements that return nothing

http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Statement.html#executeUpdate(java.lang.String)

Olá,

Não tem ninguem “segurando” o banco não? Tipo, atualizando as mesmas tabelas, mas que esqueceu de dar commit?

[]´s
Rodrigo

Eu dei uma dica para resolver o problema: limpe o seu codigo, e voce talvez enxergue alguma coisa errada que antes estava enterrada debaixo de um monte de… SQL.

Isso eh um forum de discussao, nao um helpdesk.