Você tem 4 perguntas, e todas giram em torno do uso e da funcionalidade de ROWNUM . Vou responder a cada pergunta uma a uma.
Por que (esta foi minha primeira tentativa até pesquisar SO) Selecione * From Person Where rownum> 100 e rownum <110; retorna 0 linhas?
Boa explicação de Thomas Kyte sobre ROWNUM e paginação aqui.
Um ROWNUM o valor é atribuído a uma linha após passar pela fase de predicado da consulta, mas antes que a consulta faça qualquer classificação ou agregação. Além disso, um valor ROWNUM é incrementado somente após ser atribuído, razão pela qual a consulta a seguir nunca retornará uma linha:
select *
from t
where ROWNUM > 1;
Como ROWNUM> 1 não é verdadeiro para a primeira linha, ROWNUM não avança para 2. Portanto, nenhum valor de ROWNUM pode ser maior que 1.
Por que não há uma maneira simples de fazer algo como Select... FROM... WHERE rownum BETWEEN lowerBound AND upperBound?
Sim existe. Do Oracle 12c em diante, você pode usar a nova limitação de n linhas superiores característica. Veja minha resposta aqui.
Por exemplo, a consulta abaixo retornaria os funcionários entre 4º mais alto até 7º maior salário em ordem ascendente:
SQL> SELECT empno, sal
2 FROM emp
3 ORDER BY sal
4 OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
EMPNO SAL
---------- ----------
7654 1250
7934 1300
7844 1500
7499 1600
SQL>
Como se livrar da coluna r nos valores resultantes?
Em vez de
select *
, liste os nomes de coluna necessários na consulta externa. Para o uso frequente da consulta, a criação de uma visualização é uma atividade simples e única. Como alternativa, em
SQL*Plus
você pode usar o NOPRINT comando. Ele não exibirá o nome da coluna que você não deseja exibir. No entanto, só funcionaria no SQL*Plus. Por exemplo,
COLUMN column_name NOPRINT
Por exemplo,
SQL> desc dept
Name Null? Type
----------------------------------------- -------- ------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL> COLUMN dname NOPRINT
SQL> COLUMN LOC NOPRINT
SQL> SELECT * FROM dept;
DEPTNO
----------
10
20
30
40
SQL>
Garante a paginação correta?
Sim, se você escrever a consulta de paginação corretamente.
Por exemplo,
SELECT val
FROM (SELECT val, rownum AS rnum
FROM (SELECT val
FROM t
ORDER BY val)
WHERE rownum <= 8)
WHERE rnum >= 5;
VAL
----------
3
3
4
4
4 rows selected.
SQL>
Ou use o novo recurso de limitação de linha no 12c, como mostrei acima.
Alguns bons exemplos aqui.