Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Problema con cursor en pl/sql

Estas en el tema de Problema con cursor en pl/sql en el foro de Oracle en Foros del Web. Buenas noches colegas. este es mi primer post por aca y quisiera dar las gracias en general a todos ya que esta pagina me ha ...
  #1 (permalink)  
Antiguo 05/06/2013, 19:06
 
Fecha de Ingreso: junio-2013
Mensajes: 16
Antigüedad: 10 años, 10 meses
Puntos: 0
Problema con cursor en pl/sql

Buenas noches colegas. este es mi primer post por aca y quisiera dar las gracias en general a todos ya que esta pagina me ha servido mucho y espero también ser de ayuda en un futuro a esta web.

Quisiera un poco de su conocimiento a que me ayuden a revisar este pequeño problema que aun no he podido resolver el cual tengo que crear un cursor que sume los empleados que hay en un determinado pais. esto es con la base de datos HR que viene por defecto en oracle.
Yo estuve metiendole mano y cree algo así aunque se que esta malo pero lo dejo para ver si me pueden dar ideas de como mejorarlo o podria hacerlo. no soy como las demas personas que piden que le hagan las cosas, con tal que me ayuden con la logica yo tratare de implementar sus ideas y de buscar mi propia solucion. aca les dejo lo que he hecho hasta el momento:

Código SQL:
Ver original
  1. cursor suma_cursor IS
  2. SELECT COUNT(employee_id)
  3. FROM employees
  4. WHERE department_id = (SELECT department_id
  5.                        FROM departments
  6.                        WHERE location_id = (SELECT location_id
  7.                                             FROM locations
  8.                                             WHERE country_id = (SELECT country_id
  9.                                                                 FROM countries
  10.                                                                 WHERE country_name = '&nombre_pais');

lo que se es que en esta consulta:
Código SQL:
Ver original
  1. SELECT department_id
  2. FROM departments
  3. WHERE location_id = (SELECT location_id
  4.                                  FROM locations
  5.                                  WHERE country_id =

tengo problemas ya que en esta fila obtengo mas de 1 departamento el cual aun no he podido resolver de como solo obtener 1 solo eso eso uno y lo otro no se si estara correcto.

Espero de vuestra ayuda y ojala puedan ayudarme en algo.
Agradeciendo por darse la paja de leer este testamento xD se depside

K0m3t4
Cristian Saavedra

Última edición por gnzsoloyo; 05/06/2013 a las 19:22 Razón: SQL mal etiquetado.
  #2 (permalink)  
Antiguo 05/06/2013, 19:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema con cursor en pl/sql

Es que estás complicando innecesariamente la consulta, pero además no estás considerando que la condición puesta no ´devolverá un único registro.
Piensa: ¿Cuántos empleados puede haber, de cuántos departamentos, que estén en qué lugares de un mismo país?
Con eso sólo, ya tienes una cantidad enorme de posibilidades.

Ahora bien, si lo único que necesitas es la cantidad de empleados, ni siquiera es un CURSOR, porque devuelve un único valor. Se usan cursores si vas a realizar una iteración de valores, y no es el caso.
La solución sería definir una variable y obtener el resultado.

Código SQL:
Ver original
  1. totalempleados NUMBER;
  2. totalempleados := 0;
  3.  
  4. SELECT COUNT (DISTINCT employee_id) total
  5. INTO totalempleados
  6. FROM employees E, departments D, locations L, countries C
  7. WHERE E.department_id = Ddepartment_id
  8.     AND  D.location_id = L.location_id
  9.     AND L.country_id = C.country_id
  10.     AND C.country_name = '&nombre_pais'
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 05/06/2013, 20:15
 
Fecha de Ingreso: junio-2013
Mensajes: 16
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Problema con cursor en pl/sql

Primero que nada gnzsoloyo quisiera agradecerte por tu ayuda brindada y si, tienes bastante razon, me estaba complicando un poco mas de lo necesario, pero en el ejercicio me obligan por asi decir a utilizar un cursor y eso es lo que me complica. mira te dejo a continuación el enunciado que corresponde al cursor:

1.-Crear un cursor que contabilice el número de empleados de cada país y el nombre del país en que existen sucursales.

obiamente este cursor debo anexarlo a otras cosas que me piden que haga pero lo demas ya lo tengo hecho solo he estado topado en lo del cursor. tratare de ver como implemento parte de tu codigo en el mio haber que resulta y ver si es que puedo hacer que el cursor de alguna manera funcione :)

Nuevamente te agradesco por tu ayuda =)
  #4 (permalink)  
Antiguo 05/06/2013, 22:29
 
Fecha de Ingreso: junio-2013
Mensajes: 16
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Problema con cursor en pl/sql

creo que ya implementando lo que tengo que hacer el codigo seria algo así :

Código SQL:
Ver original
  1. SET serveroutput ON
  2. DECLARE
  3.  
  4. pais countries.country_name%TYPE:='&pais';
  5. t_empleados NUMBER :=0;
  6.  
  7. cursor empleados_cursor IS
  8. SELECT COUNT (DISTINCT employee_id)
  9. FROM employees E, departments D, locations L, countries F
  10. WHERE E.department_id = D.department_id
  11.       AND D.location_id = L.location_id
  12.       AND L.country_id = F.country_id
  13.       AND UPPER(F.Country_name) = UPPER(pais);
  14. BEGIN
  15.  
  16. dbms_output.put_line('                    EMPLEADO POR PAISES                     ');
  17. dbms_output.put_line('============================================================');
  18.  
  19. OPEN empleados_cursor;
  20.   loop
  21.     fetch empleados_cursor
  22.       INTO t_empleados;
  23.       exit WHEN empleados_cursor%notfound;
  24.       IF (t_empleados < 10 ) THEN
  25.         dbms_output.put_line(RPAD('CANTIDAD EMPLEADOS',25)||RPAD('PAIS',15)||RPAD('CATEGORIA',20) );
  26.         dbms_output.put_line('============================================================');
  27.         dbms_output.put_line(RPAD(t_empleados,25)||RPAD(UPPER(pais),15)||RPAD('PEQUEÑA SUCURSAL',20) );
  28.       ELSE
  29.         dbms_output.put_line(RPAD('CANTIDAD EMPLEADOS',25)||RPAD('PAIS',15)||RPAD('CATEGORIA',20) );
  30.         dbms_output.put_line('============================================================');
  31.         dbms_output.put_line(RPAD(t_empleados,25)||RPAD(UPPER(pais),15)||RPAD('GRAN SUCURSAL',20) );
  32.       END IF;
  33.   END loop;
  34. close empleados_cursor;
  35. END;

Ahora creo que solo me queda que me muestre todas las sucursales con empleados de una y no solo buscar una en especifico ;)

Última edición por gnzsoloyo; 06/06/2013 a las 06:57 Razón: Mal etiquetado. Usar Highligt "SQL"
  #5 (permalink)  
Antiguo 06/06/2013, 07:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema con cursor en pl/sql

Bueno, en realidad lo que has hecho no está mal.... pero tampoco está bien. AL menos no lo está si se lee con cuidado la consigna que te dieron.
Fijate lo que te dicen:
Cita:
1.-Crear un cursor que contabilice el número de empleados de cada país y el nombre del país en que existen sucursales.
Es decir que se buscan estas cosas
1) Cantidad de empleados por país.
2) Países en que hay sucursales

En realidad el cursor no es para contar los empleados, sino para listar los datos resultantes, y para ello la consulta no es exactamente igual. Incluso, el proceso entero es mucho menos complicado de lo que hiciste.
Un detalle que se infiere de la consigna es que todo empleado pertenece a una sucursal, y que no hay sucursales sin empleados.

Sería mas o menos así:
Código SQL:
Ver original
  1. CURSOR cursor_suma AS
  2. SELECT C.country_name COUNT (DISTINCT employee_id) totalempleados
  3. FROM employees E, departments D, locations L, countries C
  4. WHERE E.department_id = Ddepartment_id
  5.     AND  D.location_id = L.location_id
  6.     AND L.country_id = C.country_id
  7. GROUP BY C.country_name;

Luego de eso, simplemente lo recorres y muestras los resultados. Incluso puedes sumar el total de empleado para mostrar al final, e incluso poner la cantidad de países.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 06/06/2013, 19:31
 
Fecha de Ingreso: junio-2013
Mensajes: 16
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Problema con cursor en pl/sql

de hecho es exactamente lo que tengo que hacer. debo ver cuantas personas trabajan en cada pais y mostrar los paises donde trabajen personas y si es menor a 10 que salga por panta que la empresa es pequeña y si es mas de 10 que la empresa es grande. intentare el codigo y lo coloco aca si tengo alguna duda al respecto y gracias por la ayuda prestada de todas maneras :)
  #7 (permalink)  
Antiguo 06/06/2013, 21:50
 
Fecha de Ingreso: junio-2013
Mensajes: 16
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Problema con cursor en pl/sql

ya ahora si coloco el codigo casi final ya que solo me falta afinar un detalle el cual es mostrar la cantidad de empleados en la siguiente forma:

35 United Kingd GRAN SUCURSAL
68 United State GRAN SUCURSAL
1 Germany PEQUEÑA SUCURSAL
2 Canada PEQUEÑA SUCURSAL

pero es un pelo de la cola lo que me queda =)

Código:
set serveroutput on
declare
c_empleados numeric;
c_paises varchar2(40);

cursor empleados_cursor is
select f.country_name, count(distinct employee_id)
from employees E, departments D, locations L, countries F
where E.department_id = D.department_id
    and  D.location_id = L.location_id
    and L.country_id = F.country_id
group by F.country_name;


begin
 
dbms_output.put_line('                          EMPLEADO POR PAISES                           ');
dbms_output.put_line('========================================================================');
dbms_output.put_line(RPAD('CANTIDAD EMPLEADOS',25)||RPAD('PAIS',30)||RPAD('CATEGORIA',20) );
dbms_output.put_line('========================================================================'); 
open empleados_cursor;
  loop
    fetch empleados_cursor
    into c_paises,c_empleados;
      exit when empleados_cursor%notfound;
      IF (c_empleados < 10 ) then
        dbms_output.put_line(RPAD(c_empleados,25)||RPAD(upper(c_paises),30)||RPAD('PEQUEÑA SUCURSAL',20) );
      else
        dbms_output.put_line(RPAD(c_empleados,25)||RPAD(upper(c_paises),30)||RPAD('GRAN SUCURSAL',20) );
      end if;
  end loop;
close empleados_cursor;
end;

P.D: gracias por darte el tiempo de editar mis post y colocar los codigos como se debe ya que aun no encuentro como colocarlo como tu lo haces para que se vea mas ordenado cuando los posteo.

Última edición por k0m3t4; 06/06/2013 a las 22:03

Etiquetas: cursor, pl-sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:57.