into funcion examples ejemplos convert columns 11g sql oracle stored-procedures

funcion - sql columns to rows



PaginaciĆ³n con Oracle (5)

No estoy tan familiarizado con Oracle como me gustaría. Tengo unos 250k registros, y quiero mostrarlos 100 por página. Actualmente tengo un procedimiento almacenado que recupera todo un cuarto de millón de registros en un conjunto de datos usando un adaptador de datos y conjunto de datos y el adaptador de datos. Método de relleno (conjunto de datos) en los resultados del proceso almacenado. Si tengo "Número de página" y "Número de registros por página" como valores enteros que puedo pasar como parámetros, ¿cuál sería la mejor manera de recuperar solo esa sección en particular? Digamos que si paso 10 como número de página y 120 como número de páginas, desde la declaración de selección me daría la 1880a hasta la 1200a, o algo así, mis cálculos en mi cabeza podrían estar apagados.

Estoy haciendo esto en .NET con C #, pensé que eso no es importante, si puedo hacerlo bien en el lado sql, entonces debería ser genial.

Actualización: pude usar la sugerencia de Brian, y está funcionando muy bien. Me gustaría trabajar en algo de optimización, pero las páginas vienen en 4 a 5 segundos en lugar de en un minuto, y mi control de paginación pudo integrarse muy bien con mis nuevos procesos almacenados.


Algo así debería funcionar: del blog de Frans Bouma

SELECT * FROM ( SELECT a.*, rownum r__ FROM ( SELECT * FROM ORDERS WHERE CustomerID LIKE ''A%'' ORDER BY OrderDate DESC, ShippingDate DESC ) a WHERE rownum < ((pageNumber * pageSize) + 1 ) ) WHERE r__ >= (((pageNumber-1) * pageSize) + 1)


En aras de la integridad, para las personas que buscan una solución más moderna, en Oracle 12c hay algunas características nuevas que incluyen una mejor paginación y un manejo superior.

Paginación

La búsqueda se ve así:

SELECT * FROM user ORDER BY first_name OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;

Los mejores registros de N

Obtener los mejores registros se ve así:

SELECT * FROM user ORDER BY first_name FETCH FIRST 5 ROWS ONLY

Observe cómo ambos ejemplos de consulta anteriores tienen cláusulas ORDER BY . Los nuevos comandos los respetan y se ejecutan en los datos ordenados.

No pude encontrar una buena página de referencia de Oracle para FETCH o OFFSET pero esta página tiene una excelente descripción general de estas nuevas funciones.


Pruebe lo siguiente:

SELECT * FROM (SELECT FIELDA, FIELDB, FIELDC, ROW_NUMBER() OVER (ORDER BY FIELDC) R FROM TABLE_NAME WHERE FIELDA = 10 ) WHERE R >= 10 AND R <= 15;

a través de [tecnicume]


Solo quiero resumir las respuestas y comentarios. Hay una serie de formas de hacer una paginación.

Antes de Oracle 12c no había funcionalidad OFFSET / FETCH, así que échale un vistazo al whitepaper como lo sugirió @jasonk. Es el artículo más completo que encontré sobre diferentes métodos con una explicación detallada de las ventajas y desventajas. Llevaría mucho tiempo copiarlos y pegarlos aquí, así que no lo haré.

También hay un buen artículo de los creadores de jooq que explican algunas advertencias comunes con Oracle y otras bases de datos paginación. El blog de jooq

Buenas noticias, ya que Oracle 12c tenemos una nueva funcionalidad OFFSET / FETCH. Nuevas características de OracleMagazine 12c . Por favor refiérase a "Top-N Queries and Pagination"

Puede verificar su versión de Oracle publicando la siguiente declaración

SELECT * FROM V$VERSION


Pregúntele a Tom sobre la paginación y funciones analíticas muy, muy útiles.

Esto es un extracto de esa página:

select * from ( select /*+ first_rows(25) */ object_id,object_name, row_number() over (order by object_id) rn from all_objects) where rn between :n and :m order by rn;