RowNum
Para limitar a quantidade de registros que um comando SQL retorna, é necessário utilizar funções específicas para cada banco de dados. Por exemplo, no SQL utilizamos o delimitador TOP antes do FROM, enquanto no Oracle usa-se o delimitador ROWNUM junto da cláusula WHERE; e, no PostgreSql, usa-se o delimitador LIMIT ao final do comando.
Com base nisso, percebe-se que montar um comando que sirva para todos os bancos é algo inviável. Para resolver esse desafio de forma transparente, pode-se utilizar a função LSP ROWNUM que trata o banco de dados e a posição onde o delimitador é colocado.
Descrição: A função ROWNUM retorna um trecho de SQL para limitar a quantidade de linhas de resultados em consultas, adaptando o comando conforme o tipo de banco de dados (SQL Server, Oracle ou PostgreSQL) e a posição da cláusula no comando SQL.
Características: Ao utilizar essa função, é importante sempre gerar três variáveis do tipo Alfa, as quais devem ser concatenadas ao comando SQL: uma na cláusula SELECT, uma no WHERE e outra ao final do comando. Isso deve ser feito independentemente do banco.
Proceder dessa forma garante o funcionamento e não gera nenhum tipo de erro, pois a própria função preencherá as próprias variáveis de acordo com o banco de dados.
Sintaxe: RowNum(Numero pLinhas, Alfa pPosicao, Alfa pInsAnd, Alfa End pCmdRet);
Parâmetros:
| Nome | Tipo | Descrição |
|---|---|---|
| pLinhas | Número | Quantidade de linhas que deve ser retornada no comando realizado |
| pPosicao | Alfa | Indica a posição que o comando será montado: “S” - Select; “C” - Condição (Where); “F” - Final - Deve ser utilizado sempre após o ORDER BY, caso houver. |
| pInsAnd | Alfa | Indicativo se o comando retornado deve conter a cláusula AND na frente ou não. O valor desse parâmetro somente será utilizado quando o parâmetro pPosicao for igual a “C - Condição”. Nos demais valores de pPosicao esse valor será ignorado. “S” - Sim: adiciona o AND; “N” - Não: não adiciona o AND. |
| pCmdRet | Alfa | Retorna o comando com a quantidade de registros retornados de acordo com o banco utilizado pelo cliente e a posição no comando SQL. |
Exemplos:
- Chamada da função para cláusula SELECT:
RowNum(xQuantidade_Registros, "S", "N", xSql_Quantidade_Select); - Chamada da função para cláusula WHERE (condição):
RowNum(xQuantidade_Registros, "C", "S", xSql_Quantidade_Condicao);
RowNum(xQuantidade_Registros, "C", "N", xSql_Quantidade_Condicao); - Chamada da função para o final do comando:
RowNum(xQuantidade_Registros, "F", "N", xSql_Quantidade_Final);
Exemplos de como utilizar:
- Supondo que seja necessário fazer um SELECT para que sejam retornados os registros da tabela de países, teríamos o comando abaixo vinculado a um cursor: SELECT * FROM E006PAI WHERE 1=1 ORDER BY NOMPAI ASC;
- Supondo que seja necessário fazer um SELECT para que sejam retornados apenas 10 registros da tabela de países, pode-se utilizar a regra abaixo:
Definir Alfa xSql_Quantidade_Select;
Definir Alfa xSql_Quantidade_Condicao;
Definir Alfa xSql_Quantidade_Final;
RowNum(10, "S", "N", xSql_Quantidade_Select);
RowNum(10, "C", "S", xSql_Quantidade_Condicao);
RowNum(10, "F", "N", xSql_Quantidade_Final);
SELECT + xSql_Quantidade_Select + NOMPAI FROM E006PAI WHERE 1 = 1
xSql_Quantidade_Condicao +
ORDER BY NOMPAI ASC " +
xSql_Quantidade_Final;
Observações:
O comando WHERE 1 = 1 foi inserido apenas para facilitar a demonstração em diferentes bancos.
Retornos:
- SqlServer: SELECT TOP(10) NOMPAI FROM E006PAI WHERE 1=1 ORDER BY NOMPAI ASC;
- Oracle utilizando cláusula AND: SELECT NOMPAI FROM E006PAI WHERE 1= 1 AND ROWNUM <= 10 ORDER BY NOMPAI ASC;
- Oracle sem utilizar cláusula AND: SELECT NOMPAI FROM E006PAI ROWNUM <= 10 ORDER BY NOMPAI ASC;
É importante destacar que essa linha resultará em um erro, uma vez que não foi utilizada a cláusula AND.
- PostgreSql: SELECT NOMPAI FROM E006PAI WHERE 1 = 1 ORDER BY NOMPAI ASC LIMIT 10
English
Español
English
Español


