Retorno de Procedure Firebird

14 respostas
G

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

J

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

G

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.

G

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

E

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.

G

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.

E

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

G

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?

E

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

G

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

E

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.

G

Testei e esta normal.

E

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

G

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

Muito obrigado!!

E

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

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