Consulta slq com skip firebird

9 respostas
java
L

Bom dia, tenho uma consulta, o sql começa select first 30 skip ?, depois vem os campos, no dao no método.

public List<Produto> produtos(Integer quantidade) {
    try {
        pst = Conexao.getInstance().abrirConexao().prepareStatement(SQL_PRODUTO);
        pst.setInt(1, quantidade);
        rs = pst.executeQuery();
        while (rs.next()) {
            produto = new Produto();

alguém sabe como passa a interrogação no dao para a consulta em java, obrigado.

9 Respostas

M

Amigo, não entendi direito. Vc quer passar ’ ? ’ como parâmetro ?

L

sim, a ? seria o parâmetro para o skip na consulta.

M

Amigo, desculpe a ignorância, mas não entendi o que precisa ainda. Talvez mais gente não tenha entendido também, consegue detalhar melhor?

L

no tutorial que olhei no firibird https://www.devmedia.com.br/quick-tips-first-e-skip-no-firebird-selecionando-n-registros-em-uma-consulta/14021, o skip pula intervalos de consultas, queria saber como passa o intervalo de consulta como parâmetro na consulta sql no java, eu coloco a interrogação e o paramento no método, só que da um erro numérico.

L

O erro
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -901
undefined message number

M

Agora entendi, vc usa o ‘?’ para passar a quantidade de registros à pular.

Primeiramente vamos ver se os dados estão vindo corretamente, poste a saída das duas variaveis.

public List<Produto> produtos(Integer quantidade) {
    try {
        System.out.println(quantidade);
        System.out.println(SQL_PRODUTO);
        pst = Conexao.getInstance().abrirConexao().prepareStatement(SQL_PRODUTO);
        pst.setInt(1, quantidade);
        rs = pst.executeQuery();
        while (rs.next()) {
            produto = new Produto();
L
a saída.

quantidade 100

execute block

returns(cdpro varchar(50), nmpro varchar(150), codbr varchar(100), saldo numeric(14,2),

preve numeric(14,2), prepr numeric(14,2), preat numeric(14,2), preat_prazo numeric(14,2), cdfab varchar(50) ,cdgru varchar(50), prpro numeric(14,2), qtata numeric(14,2), qtboni numeric(14,2),data integer, data_normal date, tipo char(1), legenda varchar(100))

as  begin  for

select first 30 skip ? cast(p.cdpro as varchar(50))as cdpro, p.nmpro, p.codbr, p.saldo, p.preve, p.prepr,

p.preat, ex.preat_prazo, cast(p.cdgru as varchar(50))as cdgru, cast(p.cdfab as varchar(50))as cdfab, p.prpro, p.qtata, p.qtboni,

p.dtpro - cast(30.12.1899 as date),p.dtpro  from in01pro p

left join  ex01pro ex on  ex.cdpro = p.cdpro where  p.repas = N and saldo > 0  order by p.cdpro

into

cdpro, nmpro, codbr, saldo, preve, prepr , preat, preat_prazo, cdgru, cdfab, prpro, qtata, qtboni, data, data_normal

do  begin

if (data < 0) then

begin

tipo = D;

data = data + 7;

end

else if ((data >= 1) and (data <= 31)) then

begin

tipo = M;

end

else

begin

tipo = T;

end

legenda = -- Data - T, Dia - M, Semana - D;

suspend;

end

end;

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error

SQL error code = -901

undefined message number
M

Vc pode tratar isso antes na hora de definir a variável ‘SQL_PRODUTO’, também como está fazendo via parametro
ou, só pra gente testar, tente assim:

pst = Conexao.getInstance().abrirConexao().prepareStatement(SQL_PRODUTO.replace("skip ?","skip "+quantidade));
L
Bom dia. com o replace o método funcionou.

Obrigado.

Tem como pegar o total de registro da tabela percorrer ele e substituir no skip, para fazer um insert em outra tabela?

<a class="mention" href="/u/test">@Test</a>

//@Ignore

public void produto() {

produtoTotal = new ProdutoDao().totalProduto();

for(int i = 1; i < produtoTotal; i++){

//List listaProduto = new ProdutoDao().produtos(produtoTotal);

<a href="//System.out.println">//System.out.println</a>("Produto " + listaProduto);

produtoTotal- -;

}

List listaProduto = new ProdutoDao().produtos(produtoTotal);

<a href="//System.out.println">//System.out.println</a>("Produto " + listaProduto);

}
Criado 13 de junho de 2019
Ultima resposta 22 de jun. de 2019
Respostas 9
Participantes 2