Retorno de Procedure Firebird

14 respostas
gustavohs

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();

14 Respostas

javer

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).

gustavohs

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.

gustavohs

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’  ||

‘[telefone removido]’ ||

( 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

/<em>GERA SEQUENCIA DO NUMERO DO PEDIDO PARA CONTINUAR A SEQUENCIA DE PEDIDOS JA CADASTRADOS NO SAPIENS</em>/

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

emmanuelrock

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.

gustavohs

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.

emmanuelrock

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

gustavohs

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?

emmanuelrock

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().

gustavohs

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

emmanuelrock

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.

gustavohs

Testei e esta normal.

emmanuelrock

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

gustavohs

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

Muito obrigado!!

emmanuelrock

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

Criado 17 de fevereiro de 2011
Ultima resposta 17 de fev. de 2011
Respostas 14
Participantes 3