Consulta slq com skip firebird

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.

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

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

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?

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.

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

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

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

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

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?
@Test
//@Ignore
public void produto() {
produtoTotal = new ProdutoDao().totalProduto();
for(int i = 1; i < produtoTotal; i++){
//List listaProduto = new ProdutoDao().produtos(produtoTotal);
//System.out.println("Produto " + listaProduto);
produtoTotal- -;
}
List listaProduto = new ProdutoDao().produtos(produtoTotal);
//System.out.println("Produto " + listaProduto);
}