Si sabes como utilizar la pseudo columna ROWNUM en tus PL-SQL Procedures en Oracle, podrás controlar la cantidad de filas o registros que deseas obtener cuando construyes una sentencia SELECT en los PL-SQL Procedures en Oracle.
La seudo columna ROWNUM no es una columna real, esta permite asignar un número aleatorio a las filas obtenidas por una consulta SELECT, esto no significa que la fila tenga asignado un número de forma permanente, eso es un error conceptual que confunde mucho a los desarrolladores. En una query no se puede pedir que se devuelva la fila 10, eso no existe en los PL-SQL Procedures en Oracle.
El valor de la seudo columna ROWNUM es asignado a medida que el SELECT va obteniendo las filas solicitadas, el número asignado es correlativo y comienza en 1, 2, 3, 4… N, donde N es el total de filas obtenidas por la consulta SELECT.
Revisemos algunos ejemplos prácticos para que entiendas mejor como usar la seudo columna ROWNUM en tus PL-SQL Procedures en Oracle.
Ejemplo #1: Supone que deseas obtener solo los primeros 7 empleados de un departamento en particular, veamos como se hace:
/* PL-SQL Procedures en Oracle */
Select emp.id_empleado, emp.rut, emp.nombre, emp.direccion
From t_empleado emp
Where emp.id_departamento = pin_id_departamento
And ROWNUM = 7;
Esta consulta no funcionará para obtener los primeros 7 empleados y tampoco obtendrá el empleado número 7, ya que el valor del ROWNUM aún no es asignado. Para que funcione correctamente solo se debe hacer el siguiente cambio:
/* PL-SQL Procedures en Oracle */
And ROWNUM <= 7;
En este ejemplo se cambio el signo < por el signo <=, de esta forma se obtienen las primeras 7 filas de la consulta de forma correcta.
TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
Ejemplo #2: Supone ahora que deseas obtener los primeros 7 empleados que tengan los sueldos más altos, veamos como se hace:
/* PL-SQL Procedures en Oracle */
Select emp.id_empleado, emp.rut, emp.nombre, emp.direccion, emp.sueldo
From t_empleado emp
Where emp.id_departamento = pin_id_departamento
And ROWNUM <= 7
Order By emp.sueldo desc ;
Este ejemplo no funcionará, si bien la consulta retornará los primeros 7 empleados estos no serán los de mayor sueldo, ya que el SELECT solo devolverá las 7 primeras filas que encuentre. Para que funcione correctamente se debe realizar el siguiente cambio:
/* PL-SQL Procedures en Oracle */
Select Dat.*
From (
Select emp.id_empleado, emp.rut, emp.nombre, emp.direccion, emp.sueldo
From t_empleado emp
Where emp.id_departamento = pin_id_departamento
Order By emp.sueldo desc ) dat
Where ROWNUM <= 7;
En este ejemplo primero se realiza una Subquery (VIEW) para ordenar los empleados por sueldo de forma descendente y luego se hace un SELECT a la Vista de nombre Dat para obtener los primeros 7 empleados con el sueldo más alto. La Base de Datos Oracle es lo suficientemente inteligente para no ordenar todo el conjunto de empleados del departamento y solo obtener los primeros 7.
Te propongo que pruebes de inmediato estos ejemplos en tu Base de Datos con tus propias tablas, PL-SQL Procedure y PL-SQL Function, para que comiences a ejercitar la mano y aprendas a dominar esta nueva técnica en tus PL-SQL Procedures en Oracle.
Estoy muy interesado en conocer tu opinión y/o comentario sobre este artículo, también cuéntame sobre qué es lo que quieres saber de PL-SQL Procedures en Oracle y/o dime cuál es tu principal frustración a la hora de trabajar con PL-SQL Procedures en Oracle. Estaré muy atento respondiendo tus preguntas y/o comentarios, gracias.
Saludos
Roberto Vicencio – Escritor del Reporte:
“Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
Por que no:)
MUY BUENO EL APORTE… ESTABA CON ESA INCOGNITA X Q EN SQL SERVER C UTILIZAEL SELECT TOP… MUY BUENO Y GRACIAS
Hola Nehe, gracias por comunicarte y por tu comentario, seguire escribiendo contenido que sea de utilidad para los lectores, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Esto es lo mas comun, pero, lo que yo busco es el ROWNUM en la clausula SELECT Rownum, * from y que me los devuelta en orden, 1,2,3….N
Saludos.
Hola William, gracias por comunicarte, bueno para usar el Rownum como columna debes usarlo tal como lo escribiste y te mostrara el numero de cada fila obtenida, por ejemplo:
Select Rownum, col1, col2, col3 from tu_tabla;
Resultado:
1, valor_col1, valor_col2, valor_col3
2, valor_col1, valor_col2, valor_col3
3, valor_col1, valor_col2, valor_col3
PD: Ya obtuviste mi reporte gratuito sobre ‘Cómo Construir un SELECT Eficiente en Oracle en Solo 7 Pasos’, si aún no lo has hecho puedes obtenerlo desde aquí:
https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Tu información me ha ayudado para saber el último renglón de un set ordenado, no sabía que había que tratarla como un view. Muchísimas gracias! Aunque he tenido que repetir la consulta. Mira:
–rownum de una consulta con order solo se obtiene correctamente al considerarla como subconsulta
select aaa.id_de_la_fila_que_me_interesa into idAsignacion from
(select rownum numerador, aa.* from
(select a.* from tabla_que_trae_cero_o_varios_renglones_entre_la_fecha_dada a where
a.id_llave1 = LLAVE1 and a.id_llave2 = LLAVE2
and FECHA >= a.fecha_inicio
order by a.fecha_inicio, a.fecha_final) aa) aaa
where numerador = (select max(rownum) from
(select a.* from tabla_que_trae_cero_o_varios_renglones_entre_la_fecha_dada a where
a.id_llave1 = LLAVE1 and a.id_llave2 = LLAVE2
and FECHA >= a.fecha_inicio
order by a.fecha_inicio, a.fecha_final)
);
return idAsignacion;
Hola Marcelo, gracias por comunicarte y por tu comentario, creo que abordaste de buena forma la solución del problema, a medida que vayas practicando irás mejorando este tipo de consultas, gracias.
PD: Ya obtuviste mi libro-reporte gratuito sobre “Cómo Construir un SELECT Eficiente en Oracle en Solo 7 Pasos”, si aún no lo tienes puedes descargarlo desde aquí:
https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
gracias por el ejemplo pero tengo una duda, mira lo que deseo es poder elegir los 3 primeros entre una lista de pedidos por ejemplo los 3 productos mas comprados, de la tabla compras donde esta de manera individual guardados las ordenes de compra
Hola Miguel, gracias por comunicarte y por tu comentario, si te entiendo bien la pregunta para conseguir los 3 primeros productos mas comprados puedes hacer algo como lo siguiente:
Select Dat.*
From (
Select com.id_producto, count(1)
From t_compras com
group by com.id_producto
Order By count(1) desc ) dat
Where rownum <= 3; — Primeros tres productos
PD: Ya obtuviste mi libro-reporte gratuito sobre "Como Contruir un SELECT Eficiente en Oracle en Solo 7 Pasos", si aun no lo tienes puedes obtenerlo desde el siguiente enlace:
https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
MUCHAS GRACIAS…..
Esta página siempre me ha ayudado, MUCHAS GRACIAS, me has salvado el trabajo.
Que tal Galo, gracias por tu excelente comentario, me da mucho gusto que estos artículos te sean de utilidad, si te ha gustado el contenido de este blog te invito a que compartas el enlace https://dominatuspackagesen0racle.com/ con tus amigos o con personas que también les pueda interesar esta información, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Hola quería saber como se realiza una relación de la siguiente información: tengo tres tablas la primera es avance
|Tabla_avance |
———————–
|proyecto| pagado|
———————–
|1 | 8000|
———————————————-
Tabla_Pagos –
———————————————————–
cve_beneficiario id_proyecto pagado fecha_pagado
12564 1 64 11/05/2015
14578 1 70 11/05/2015
Tabla_Gastos
——————————
id_proyecto materiales
1 10
1 5
quiero obtener el siguiente reporte al unirlas
Proyecto sumatoria Pagado sumatoria materiales
1 264 15
espero y me puedas contestar gracias
Hola Roberto, gracias por comunicarte, para resolver este problema debes unir estas 3 tablas por el id del proyecto, hacer un grupo por el id del proyecto y finalmente sumar, algo como lo siguiente:
select ava.proyecto, sum(pag.pagado) sumatoria_pagado, sum(gas.materiales) sumatoria_materiales
from tabla_gastos gas, tabla_pagos pag, tabla_avance ava
where ava.proyecto = 1
and pag.id_proyecto = ava.proyecto
and gas.id_proyecto = pag.id_proyecto
group by ava.proyecto;
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
tengo una lista de convenios con fechas de inicio y fecha de fin de contrato, cada registro de la lista es un convenio nuevo: se quiere validar que la fecha de inicio siguiente sea mayor a la fecha de fin ultimo, si es asi entonces la fecha de inicio debera llevarle solo un dia de diferencia la fecha anterior.
muchas gracias por el apoyo: lo e tratado de hacer con una funcion o dentro sp en oracle pero no veo como controlar esa lista..dentro de un query.
Hola Jesus, gracias por comunicarte, esta validación es complicada hacerla dentro de un solo query, lo mejor es que crees un procedure con un cursor que liste los convenios ordenados por la fecha de inicio, luego lees cada registro del cursor guardando en una variable la fecha fin del convenio actual y la validas con la fecha de inicio del convenio siguiente para ver si la fecha es mayor o menor y tomar alguna acción.
PD: Ya pudiste ver mi libro-reporte sobre “Cómo Crear un SELECT Eficiente en Oracle en Solo 7 Pasos”, si aún no lo tienes en tus manos puedes obtenerlo desde aquí https://dominatuspackagesen0racle.com/
PD2: Si te ha gustado el blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar ver este contenido, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Estimado
En pl/sql necesito obtener sólo las 3 últimas facturas de venta de cada producto: Ejemplo
PRODUCTO FACTURA
Zapatos 3
Zapatos 2
Zapatos 1
Cinturón 3
Cinturón 2
Cinturón 1
Saludos
Hola Felipe, gracias por comunicarte, tengo un vídeo donde explico como obtener el artículo mas comprado, creo que te puede ayudar para lo que necesitas, este es el enlace: https://dominatuspackagesen0racle.com/como-obtener-en-un-select-el-articulo-mas-comprado-en-pl-sql-packages-en-oracle.html
PD: Si te ha gustado lo que has visto del blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar ver esta información, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Buenas tardes me podrian decir una maneta de hacer la sig consulta. Tengo una tabla con nombres quiero enumerarlos por ejemplo todos los q comienzan con “j” despues todos los q comienzar con “b” y que quedara de la sig manera:
1 juan
2 julieta
3 javier
1 blanca
2 bernardo
3 benito
4 bob
R