2009-01-28 10 views
5

Una de las aplicaciones que me ocupo al verificar una tabla Oracle DB cada x segundos para ver si hay nuevos datos para procesar (otra aplicación en tiempo real lo está poblando).Limitación del registro devuelto de la consulta SQL en Oracle

Nuestro nuevo proceso comercial del cliente fuerza nuestro tiempo real para completar esta tabla con muchos registros al mismo tiempo (digamos 10 000), pero solo unas pocas veces al día. La próxima vez que mi aplicación compruebe si hay algo que procesar, encontrará 10 000 registros e intentará procesarlos.

No está muy bien diseñado y simplemente no escala suficientemente bien. La solución rápida sería limitar el número de registros que la aplicación obtiene de Oracle, la próxima vez elegirá otros 50 (o lo que sea) etc.

¿Cómo puedo limitar en Oracle SQL el número de registros devueltos? ¡El orden importa!

select * 
    from cool_table where date >= to_date('200901010000', 'YYYYMMDDhh24mi') 
order by seq_nr, entry_dts; 

Respuesta

15
select * from 
(select c.* from cool_table c 
    where date >= to_date('200901010000', 'YYYYMMDDhh24mi') 
    order by seq_nr, entry_dts) 
where rownum < 50 

Es necesario garantizar el ordenamiento se hace antes de la filtración rownum (de lo contrario, tomar las primeras 50 filas que encuentra, entonces ellos pedido)

1

A partir de Oracle 12c que finalmente apoya la estándar ANSI fetch first n rows opción:

select * 
from cool_table where date >= to_date('200901010000', 'YYYYMMDDhh24mi') 
order by seq_nr, entry_dts 
fetch first 50 rows only; 

Esto se puede combinar con un desplazamiento para paginación:

select * 
from cool_table where date >= to_date('200901010000', 'YYYYMMDDhh24mi') 
order by seq_nr, entry_dts 
offset 50 rows 
fetch first 50 rows only; 
Cuestiones relacionadas