Retorno de Procedure Firebird

Boa dia galera, Essa procedure tinha que retornar string com varias linhas. Mais soh estou conseguindo mostrar a primeira linha, o que estou fazendo de errado.?

conn = DriverManager.getConnection("jdbc:firebirdsql:192.100.0.000:/coper/dados/dbcoper.gdb","teste","teste"); //Cria um statement para podermos mandar um SQL para o banco stmt = conn.createStatement(); CallableStatement cs = conn.prepareCall("{call GERA_CABECALHO_PEDIDOS_PALM(?,?)}"); cs.setInt(1, 391553); cs.setInt(2, 2260); cs.registerOutParameter(1, Types.VARCHAR); cs.execute(); rs = cs.getResultSet(); while (rs.next()){ System.out.println(rs.getString("cabecalho_pedido")); } conn.close();

Coloque aqui o SQL da SP que esta usando (tenho um pouco de experiência no FB, mas desisti de usar SP há muito tempo).

A procedure esta funcionado, no IBexpert ela funciona.
O resutado dela eh o seguinte.
nome da coluna= cabecalho_pedido
valores:
644949494949498024141387418734
084018013408919841481482134813
018734013401341341834132841237
4198341-34124981230413498-08134

onde cada linha eh um registro.
e ela esta pegando somente a primeira.

Seque em aeee a procedure:

begin

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// NAO ESQUECER DE MUDAR O NUMERO INICIAL DO PEDIDO//////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/
/PARA OS PEDIDOS DA MATRIZ - UBERABA/
pedidoant = 0;

for select distinct p.nopedido, (‘640’ || ‘0001’ || ‘’ ||
(
case p.cdlocal
when 1 then ‘0008’
when 20 then ‘0001’
end
) || ‘’ || (
case p.cdrepresentante
when 35004 then ‘0002’
when 35036 then ‘0003’
when 35107 then ‘0004’
when 35026 then ‘0004’
when 35056 then ‘0005’
when 35080 then ‘0006’
when 35032 then ‘0007’
when 35075 then ‘0008’
when 35008 then ‘0009’
when 35016 then ‘0010’
when 35099 then ‘0012’
when 35009 then ‘0012’
when 35112 then ‘0013’
when 35073 then ‘0027’
when 35100 then ‘0019’
when 632521 then ‘0013’
when 659721 then ‘0028’
when 648921 then ‘0030’
end
)
|| lpad(p.nopedido,8,0)) parte1 , (lpad(c.nocnpjcpf,14,0) || lpad(p.nopedido,20,0) || ‘’ ||
(SUBSTR(CAST(CAST(P.dtpedido AS DATE) AS VARCHAR(11)),9,2) || ‘/’ || SUBSTR(CAST(CAST(P.dtpedido AS DATE) AS VARCHAR(11)),6,2) ||
‘/’ ||SUBSTR(CAST(CAST(P.dtpedido AS DATE) AS VARCHAR(11)),1,4)) || ‘07:1000000000000000000000’ || ‘08’ ||
‘9010010000’ ||
( case p.cdcondpag
when 1 then ‘001’
when 7 then ‘058’
when 13 then ‘020’
when 14 then ‘003’
when 20 then ‘012’
when 21 then ‘028’
when 22 then ‘002’
when 23 then ‘053’
when 26 then ‘008’
when 27 then ‘011’
when 28 then ‘004’
when 29 then ‘056’
when 30 then ‘010’
when 49 then ‘023’
when 50 then ‘038’
when 51 then ‘059’
when 57 then ‘026’
when 999 then ‘999’
when 998 then ‘999’
when 132 then ‘009’
when 151 then ‘039’
when 283 then ‘060’
when 287 then ‘047’
when 308 then ‘063’
when 348 then ‘029’
WHEN 53 then ‘064’
end
)
|| ‘000000’ || (SUBSTR(CAST(CAST(P.dtpedido + 10 AS DATE) AS VARCHAR(11)),9,2) || ‘/’ || SUBSTR(CAST(CAST(P.dtpedido + 10 AS DATE) AS VARCHAR(11)),6,2) ||
‘/’ || SUBSTR(CAST(CAST(P.dtpedido + 10 AS DATE) AS VARCHAR(11)),1,4)) || ‘00000000’ || P.dsobservacao
) as parte2
from pdvendas p, pdvendasitens pdi , clientes c
where p.nopedido = pdi.nopedido
and p.cdempresa = pdi.cdempresa
and p.cdlocal = pdi.cdlocal
and c.cdtitular = p.cdcliente
and p.nopedido >= :ApartirDoPedidoCopervale – PROXIMO PEDIDO DO COPERVALE
and p.cdempresa = 1
and p.cdlocal = 20
and p.cdrepresentante <> 35020
and p.dtpedido > ‘01.01.2011’
order by p.nopedido into :pedidosql, :comeco, :fim do
begin
/GERA SEQUENCIA DO NUMERO DO PEDIDO PARA CONTINUAR A SEQUENCIA DE PEDIDOS JA CADASTRADOS NO SAPIENS/
if (:pedidoant = 0) then
BEGIN
PEDIDO = :APARTIRDOPEDIDOSAPIENS; – COMECA NESTE PEDIDO NO SAPIENS
pedidoant = :pedidosql;
END
else
pedido = :pedido + 1;

    cabecalho_pedido = trim(:comeco) || trim(lpad(:pedido,8,0)) || trim(:fim);

suspend;
end

end

Acho que está entrando no primeiro if e não está executando o SUSPEND. Tenta por o SUSPEND dentro do IF e não só no ELSE.

Coloquei não deu certo, soh mudou que a primeira linha veio null.
Ae agora nao mostra nada.
Ele nao vai para as proximas linhas.

Dá uma olhada nesse material:http://www.comunidade-firebird.org/cflp/downloads/CFLP_T003.PDF

Emanuel, obrigado pelo material, mas a procedure está funcionano no IBexpert. No java que nao estou conseguindo pegar todas as linhas de resposta.

Dah uma olhanda no meu while no java v c tem algo de errado?

Dá uma olhada no banco quantas linhas a procedure traz e compara no Java quantas linhas tem o resultSet (passando os mesmos parâmetros em ambas as consultas, faça um debug no Java).

Ou tenta assim:

CallableStatement cs = conn.prepareCall("{call GERA_CABECALHO_PEDIDOS_PALM(?,?)}");   

cs.setInt(1, 391553);   
cs.setInt(2, 2260);   
cs.registerOutParameter(1, Types.VARCHAR);   

rs = cs.executeQuery();   
while (rs.next()){   
    System.out.println(rs.getString("cabecalho_pedido"));   
} 

conn.close();   

Com executeQuery() ao invés de execute().

Então tah mesma coisa.
Mais ele tah travando dentro do print, e mostra soh uma linha.
Não estou entendendo isso. A procedure esta certa, e o resultado dela tambem no Ibexpert.

Isso que tah me deixando lokoo.
vlww emanuel

Você ja tentou navegar pelas linhas da procedure no IBX? Ex: manda o cursor para a ultima linha. É que as vezes acontece de alguma linha estar com problema de overflow impossibilitando a navegação do resultSet.

Testei e esta normal.

Já tentou assim:

PreparedStatement ps = conn.prepareStatement("SELECT nomeDoSeuParametroDeRetorno from GERA_CABECALHO_PEDIDOS_PALM(?,?)");     
  
ps.setInt(1, 391553);     
ps.setInt(2, 2260);     
  
rs = ps.executeQuery();     
while (rs.next()){     
    System.out.println(rs.getString(nomeDoSeuParametroDeRetorno));     
}   
  
conn.close();    

Sua procedure é de seleção, não de execução.

Fonte:http://www.firebirdsql.org/index.php?op=devel&sub=jdbc&id=faq#39

Vlw emanuel vc eh o cara…deu certo!!!

Muito obrigado!!

É Emmanuel, com dois m’s. :slight_smile: