Dúvida Parametro de retorno de procedure[RESOLVIDO]

11 respostas
dsystem

Boa tarde pessoal… tudo bem???

É o seguinte… estou com uma pequena dúvida… Se puderem me ajudar ficarei muito grata…

Tenho um método que chama uma procedure e me retorna um parametro contendo o codigo de um pedido(essa procedure retorna outros parametros mas não vem ao caso).

Tenho outro método que faz um select e uma das condições para o select é passar o id do pedido. Agora que vem a dúvida. O id que eu preciso passar é o que a procedure me retornou.

É possível eu pegar esse valor de retorno e passar no meu select???

Ambos métodos estão na mesma classe.

Bom pessoal, se sim…Poderiam me dizer como faço???
se não, há uma outra solução???

Obrigada

11 Respostas

aluisiodsv

Sim é possível!
Mas eu precisaria de mais detalhes pra te informar como fazer isto.
Uma outra classe acessa esta classe e chama estes métodos ?
Ou vc quer q dentro da mesma classe seja feito isso ?
Estes métodos são utilizados em outros locais do sistema ?

Está muito vago sua dúvida em cima de um código já montado.
Mostre o código e diga mais precisamente o q está fazendo.

dsystem

aluisiodsv,

Em primeiro lugar obrigada por responder…
É o seguinte…

Na mesma classe tenho dois métodos, um que inclui e exclui item e outro que busca produtos similares.

[Vou colocar o código simplificado pq ele é gigante]

private boolean executaInclusaoExclusaoItemPedidoVenda	( UserLoginBean userBean, PedidoVendaBean pedidoVendaBean, ItemPedidoVendaBean itemPedidoVendaBean, String tipoAcao ) throws InvalidException, CommerceException{
		Connection con = null;
		CallableStatement cs = null;
		try{
			con = super.getConnection();
			cs = con.prepareCall( "{ call PRCD_PVD_GERAL_JAVA(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) }" );

....

cs.registerOutParameter( 7, Types.INTEGER );
itemPedidoVendaBean.setCodigoPedido( new Integer( cs.getInt( 7 ) ) );

....

}

Esse é o método que inclui ou exclui produtos…
Ele chama uma procedure e um dos retornos é o código do Pedido.

Tenho outro método que até então está assim

public ListaProdutoSimilarBean getListaProdutoSimilarBean(UserLoginBean userLoginBean, PedidoVendaBean pedidoVendaBean, Long codigoEAN ) throws CommerceException{

		Connection con = null;
		CallableStatement cs = null;
		CallableStatement csa = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		ListaProdutoSimilarBean listaProdutoSimilarBean = null;
		StringBuffer query = new StringBuffer();
		
		try{
			
			con = super.getConnection();
			
			
			cs = con.prepareCall( "{call PRCD_PROD_SIMILAR_JAVA(?, ?, ?, ?, ?) } " );
			cs.setInt(1,userLoginBean.getUnidadeNegocio());
			cs.setInt(2,userLoginBean.getEmpresa());
			cs.setInt(3, pedidoVendaBean.getCodigoPedido() );
			cs.setLong(4, codigoEAN.intValue());
			cs.registerOutParameter(5,Types.VARCHAR);		
			
			cs.executeUpdate();
			System.out.println(cs.getString(5));
			
			if(cs.getString( 5 ).equals("S")){
				query.append( " SELECT " );				
				query.append( " PS.ID_PRO, " );
				query.append( " PS.ID_PRO_SIM, " );
				query.append( " PS.NM_PRO_SIM, " );
				query.append( " PS.QT_FIS_EMP, " );
				query.append( " PS.QT_FIS_CDI " );
				query.append( " FROM " );
				query.append( " AUX_ITEM_PEDIDO_VENDA_SIMILAR PS " );
				query.append( " WHERE " );
				query.append( " PS.ID_UNN = ? AND " );
				query.append( " PS.ID_EMP = ? AND " );
				query.append( " PS.ID_PVD = ? " );
				
				ps = con.prepareStatement( query.toString() );
				ps.setInt(1,userLoginBean.getUnidadeNegocio());
				ps.setInt(2,userLoginBean.getEmpresa());
				ps.setInt(3, pedidoVendaBean.getCodigoPedido() );
				
				rs = ps.executeQuery();
				
				if( rs.next() ){				
					listaProdutoSimilarBean = new ListaProdutoSimilarBean();
					do{
						ProdutoSimilarBean produtoSimilarBean;
					    	produtoSimilarBean = new ProdutoSimilarBean();						
						produtoSimilarBean.setIdProduto( new Integer( rs.getInt( "ID_PRO" )));
						produtoSimilarBean.setIdProdutoSimilar( new Integer( rs.getInt( "ID_PRO_SIM" )));
						produtoSimilarBean.setNomeProdutoSimilar( new String(rs.getString( "NM_PRO_SIM" )));
						produtoSimilarBean.setQtdFisicaEmpresa( new Integer( rs.getInt( "QT_FIS_EMP" )));
						produtoSimilarBean.setQtdFisicaCDI( new Integer (rs.getInt( "QT_FIS_CDI" )));
						listaProdutoSimilarBean.addProdutoSimilarBean(produtoSimilarBean);
					}while( rs.next() );						
						StringBuffer delete = new StringBuffer();
						delete.append( " DELETE ");
						delete.append( " AUX_ITEM_PEDIDO_VENDA_SIMILAR ");
						delete.append( " WHERE ");
						delete.append( " ID_UNN = ? AND " );
						delete.append( " ID_EMP = ? AND " );
						delete.append( " ID_PVD = ? ");
						ps = con.prepareStatement( delete.toString() );
						ps.setInt(1 ,userLoginBean.getUnidadeNegocio());
						ps.setInt(2,userLoginBean.getEmpresa());
						ps.setInt(3,pedidoVendaBean.getCodigoPedido() );
						ps.executeUpdate();	
						con.commit();
						
				}
			}
			return listaProdutoSimilarBean;
		}catch( SQLException e ){
			throw new CommerceException( e.getMessage(), e.getErrorCode() );			
		}

O que eu preciso é que dentro desse meu ultimo método, em todos os lugares que passei " pedidoVendaBean.getCodigoPedido() " , preciso passar aquele retorno da procedure do primeiro método.
Relembrando que eles estão dentro da mesma classe.

Bom, com isso deu pra entender???

aluisiodsv

Esse código precisa ser muito melhorado, tem muita coisa errada aí. Mas isso é outra coisa.

O primeiro método, conforme está escrito, retorna um tipo boolean (true|false), e pelo q entendi, vc precisa de um código, provavelmente um integer.
Então o retorno daquele primeiro método não é do mesmo tipo q vc precisa.
Não vai dar certo fazer isto.

Vc diz q um dos retornos é o código. Mas o método só retorna uma coisa. Que no caso é o boolean.

dsystem

aluisiodsv,

Mais uma vez, obrigada por me ajudar.

Consegue resolver o problema.

SOLUÇÃO

Na minha action que busca a lista dos produtos similares coloquei um parâmetro para ela passar. Esse parâmetro viria de outra Action e com isso eu teria o itemPedidoVendaBean.getCodigo() que era o que eu estava precisando.
Quanto aos erros, isso tenho que ver aos poucos. Pois ainda sou iniciante no assunto, e aqui na empresa já peguei o sistema pronto.

Mais uma vez, obrigada

Att
Daniele

aluisiodsv

Sabia q só faltava pensar um pouco mais, pq eu não estava entendendo o pq vc qria o retorno do método de cima no método de baixo, sem acessá-los de outro lugar.

Mas é isso aí.

O interessante com o java é q qnto mais se desenvolve, melhor, e mais consciente do q faz, vc fica!

dsystem

Pois é…

As vezes são coisas bestas…

mas to aprendendo muito.

Estou na área faz 6 meses, sendo dois com C# e 4 com Java…E já aprendi muito…

Obrigada

aluisiodsv

Gostou mais do java ou do c# ??

dsystem

eu sou TOTALMENTE JAVA…
Embora a primeira linguagem que aprendi foi C#, quando aprendi Java me apaixonei…rs

mas agora terei que mexer com C# tb. Pq aqui na empresa eles precisam de um webservice em c#. E como a unica pessoa que mexe com C#(embora não saiba nada de webservice) sou eu, então terei que apanhar…rs

lelodois

Existem alguns facilitadores para trabalharmos com jdbc… SPRING!!!

Abrange proc, resultSet e xyz.
vide

http://static.springsource.org/spring/docs/2.0.8/reference/jdbc.html

Meu exemplo

class ProcedureMy extends StoredProcedure{
		public ProcedureMy(DataSource ds){
			super(ds, "PACKAGE.PROC");
			
			this.declareParameter(new SqlParameter("name", Types.VARCHAR));
			
			RowMapper rowMapper = new RowMapper(){ 
				public Object mapRow(ResultSet rs, int rowNumber) throws SQLException {
					
					MyObject my = new MyObject();
					my.set(rs.getInt("resultado"));
					return  my;
				}
			};						
			this.declareParameter(new SqlOutParameter("p_retorno", OracleTypes.CURSOR, rowMapper));
			this.compile();
		}
	}

Ou o próprio HIBERNATE.

Melhor que escrever uma linha de código, é excluir linhas de códigos reutilizando oq já existe.
:wink:

dsystem

lelodois,

Se eu fosse uma pessoa normal(ou seja, se não fosse programadora.rs), eu diria: Que coisa de louco…

Mas como sou uma…

De inicio, sinceramente não entendi nada…

Mas vou dar uma lida no material que me passou para tentar entender…

lelodois

dsystem:
lelodois,
Se eu fosse uma pessoa normal(ou seja, se não fosse programadora.rs), eu diria: Que coisa de louco…
Mas como sou uma…
De inicio, sinceramente não entendi nada…
Mas vou dar uma lida no material que me passou para tentar entender…

É uma abordagem diferente e fácil de aprender, a princípio é estranho.

Qualquer dúvida poste ai.
:wink:

Criado 10 de agosto de 2010
Ultima resposta 11 de ago. de 2010
Respostas 11
Participantes 3