SlideShare une entreprise Scribd logo
1  sur  18
Sistemas de Base de Datos

4.3- Cursores
  Las operaciones en una base de datos relacional se
  realizan sobre conjuntos de tuplas. La sentencia
  SELECT actúa sobre tablas y da como resultado un
  conjunto de tuplas (otra tabla).
  En muchas aplicaciones no siempre es posible trabajar
  adecuadamente sobre conjuntos de tuplas, sino se
  necesitan de mecanismos para trabajar con una tupla a
  la vez.
  Los CURSORES son una extensión del SQL que
  permiten procesar las tuplas de una en una.

  Nota.- Se recomienda que sean utilizados como ultimo
  recurso para la generación de consultas, en vista que
  consumen recursos y tiempo en el servidor.

                      DAI - Ing. Arturo Rozas Huacho   1
Sistemas de Base de Datos

 4.3- Cursores…(Sintaxis)
-- Declarar el cursor
DECLARE nombre-cursor CURSOR   FOR (sentencia SELECT)
-- Abrir el cursor
OPEN nombre-cursor
-- Recuperar la primera tupla
FECTH NEXT FROM nombre_cursor   INTO @Variable1, @Variable2, …
-- Estructura repetitiva para procesar cada tupla
WHILE @@Fetch_Status = 0
begin
  instrucciones que procesen cada Tupla
  -- Recuperar siguiente tupla
  FECTH NEXT FROM nombre_cursor INTO @Variable1, @Variable2, …
end; -- while
-- Cerrar y liberar la memoria utilizada por el cursor
CLOSE nombre_cursor
DEALLOCATE nombre_cursor
                        DAI - Ing. Arturo Rozas Huacho      2
Sistemas de Base de Datos

 4.3- Cursores…(Ejemplo)
Dada la siguiente base de datos:

Carrera_Profesional( Cod_CP, Nombre_CP )

Alumno(Cod_Alumno, Paterno, Materno, Nombres, Cod_CP )

Docente(Cod_Docente, Paterno, Materno, Nombres, Categoria,Regimen )

Asignatura(Cod_Asignatura, Cod_CP,
Nombre_Asignatura,Categoria,Creditos )

Catalogo(Semestre, Cod_Asignatura, Cod_CP, Grupo, Cod_Docente )

Matricula(Semestre, Cod_Asignatura, Cod_CP, Grupo, Cod_Alumno, Nota )



                            DAI - Ing. Arturo Rozas Huacho            3
Sistemas de Base de Datos

4.3- Cursores…(Ejemplo)

Determinar la relación de asignaturas aprobadas por
el alumno de código ‘980115’, con su respectivo
creditaje y el acumulado de los créditos.



      R(Cod_Asignatura, Creditos, Cred_Acum)




                      DAI - Ing. Arturo Rozas Huacho   4
Sistemas de Base de Datos

4.3- Cursores…(Ejemplo 1, Variante 1)
 -- Crear tabla de resultados
 create table #CreditosAcumulados
 ( Cod_Asignatura varchar(5),
   Creditos         int,
   Acum_Creditos    int);
 -- Declarar el cursor
 DECLARE cu_CreditosAcumulados CURSOR
     FOR SELECT M.Cod_Asignatura, A.Creditos
            FROM Matricula M inner join Asignatura A
            ON (M.Cod_Asignatura = A.Cod_Asignatura) and
               (M.Cod_CP = A.Cod_CP)
            WHERE (M.Cod_Alumno = '980115') AND
                  (Nota in ('11','12','13','14','15',
                            '16','17','18','19','20'))
 -- Declarar variables para utilizar en el cursor
 DECLARE @Cod_Asignatura varchar(5),
          @Creditos int,
          @Acum_Creditos int
 -- Inicializar la variable @Acum_Creditos
 SET @Acum_Creditos = 0


                         DAI - Ing. Arturo Rozas Huacho    5
Sistemas de Base de Datos
4.3- Cursores…(Ejemplo 1, Variante 1)
 -- Abrir el cursor
 OPEN cu_CreditosAcumulados
 -- Recuperar el primer registro en las variables
 FETCH NEXT FROM cu_CreditosAcumulados
   INTO @Cod_Asignatura, @Creditos
 -- Procesar cada registro
 WHILE @@FETCH_STATUS = 0
 BEGIN
   -- Acumular creditaje
   set @Acum_Creditos = @Acum_Creditos + @Creditos;
   -- Insertar en tabla de resultados
   INSERT INTO #CreditosAcumulados
       values(@Cod_Asignatura, @Creditos, @Acum_Creditos)

   -- Recuperar siguiente registro
   FETCH NEXT FROM cu_CreditosAcumulados
      INTO @Cod_Asignatura, @Creditos
 END
 -- Cerrar el cursor
     CLOSE cu_CreditosAcumulados
     DEALLOCATE cu_CreditosAcumulados
 -- Mostrar en la consulta los datos solicitados
  SELECT * FROM #CreditosAcumulados
                         DAI - Ing. Arturo Rozas Huacho     6
Sistemas de Base de Datos

4.3- Cursores…(Ejemplo 1, Variante 2)
 -- Crear tabla de resultados
 declare @CreditosAcumulados table( Cod_Asignatura varchar(5),
                                    Creditos        int,
                                    Acum_Creditos   int);
 -- Declarar el cursor
 DECLARE cu_CreditosAcumulados CURSOR
   FOR SELECT M.Cod_Asignatura, A.Creditos
         FROM Matricula M inner join Asignatura A
         ON (M.Cod_Asignatura = A.Cod_Asignatura) and
            (M.Cod_CP = A.Cod_CP)
         WHERE (M.Cod_Alumno = '980115') AND
               (Nota in ('11','12','13','14','15',
                         '16','17','18','19','20'))
 -- Declarar variables para utilizar en el cursor
 DECLARE @Cod_Asignatura varchar(5),
          @Creditos int,
          @Acum_Creditos int
 -- Inicializar la variable @Acum_Creditos
 SET @Acum_Creditos = 0



                         DAI - Ing. Arturo Rozas Huacho          7
Sistemas de Base de Datos

4.3- Cursores…(Ejemplo 1, Variante 2)
-- Abrir el cursor
OPEN cu_CreditosAcumulados
-- Recuperar los valores de la primera tupla
FETCH NEXT FROM cu_CreditosAcumulados INTO @Cod_Asignatura,@Creditos
-- Procesar cada tupla
WHILE @@FETCH_STATUS = 0
BEGIN
  -- Acumular creditaje
  set @Acum_Creditos = @Acum_Creditos + @Creditos;
  -- Insertar en tabla de resultados
  INSERT INTO @CreditosAcumulados
     values(@Cod_Asignatura, @Creditos, @Acum_Creditos)

  -- Recuperar valores de la siguiente tupla
  FETCH NEXT FROM cu_CreditosAcumulados
     INTO @Cod_Asignatura, @Creditos
END
-- Cerrar el cursor
    CLOSE cu_CreditosAcumulados
    DEALLOCATE cu_CreditosAcumulados
-- Mostrar en la consulta los datos solicitados
 SELECT * FROM @CreditosAcumulados
                          DAI - Ing. Arturo Rozas Huacho           8
Sistemas de Base de Datos

 4.3- Cursores…(Ejemplo 2)

Asumiendo que en procesos previos se obtuvo la
siguiente Tabla:

#Alumno(Cod_Alumno, Nombres, Cod_CP, Promedio )


Determinar los dos mejores estudiantes de cada
carrera profesional:




                        DAI - Ing. Arturo Rozas Huacho   9
Sistemas de Base de Datos

4.3- Cursores…(Ejemplo 2)
 -- Crear tabla de resultados
 declare @Mejores table( Nro int,
                          Cod_Alumno varchar(6),
                          Nombres    varchar(40),
                          Cod_CP     varchar(2),
                          Promedio   Numeric(15,2));
 -- Declarar el cursor
 DECLARE cu_MejoresCURSOR
   FOR SELECT Cod_Alumno, Nombres, Cod_CP, Promedio
         FROM #Alumno
         SORT BY Cod_CP, Promedio DESC
 -- Declarar variables para utilizar en el cursor
 DECLARE @Nro          int,
          @Cod_Alumno varchar(6),
          @Nombres     varchar(40),
          @Cod_CP      varchar(2),
          @Promedio    Numeric(15,2),
          @Cod_CP_Aux varchar(2)

                       DAI - Ing. Arturo Rozas Huacho   10
Sistemas de Base de Datos
4.3- Cursores…(Ejemplo 2)
-- Inicializar la variable @Acum_Creditos
SET @Nro = 0; SET @Cod_CP_Aux = ’’;
-- Abrir el cursor
OPEN cu_Mejores
-- Recuperar los valores de la primera tupla
FETCH NEXT FROM cu_Mejores
  INTO @Cod_Alumno, @Nombres, @Cod_CP, @Promedio
-- Procesar cada tupla
WHILE @@FETCH_STATUS = 0
BEGIN
  -- Incrementar o Inicializar contador
  IF (@Cod_CP_AUX = @Cod_CP)
    set @Nro = @Nro + 1;
  ELSE
    set @Nro = 1;
  -- Insertar en tabla de resultados
  IF (@Nro <= 2)
    INSERT INTO @Mejores
       values(@Nro, @Cod_Alumno, @Nombres, @Cod_CP, @Promedio);
  set @Cod_CP_AUX = @Cod_CP;
  -- Recuperar valores de la siguiente tupla
  FETCH NEXT FROM cu_Mejores
    INTO @Cod_Alumno, @Nombres, @Cod_CP, @Promedio
END                        DAI - Ing. Arturo Rozas Huacho         11
Sistemas de Base de Datos
4.3- Cursores…(Ejemplo 2)
-- Cerrar el cursor
   CLOSE cu_Mejores
   DEALLOCATE cu_Mejores
-- Mostrar en la consulta los datos solicitados
 SELECT *
   FROM @Mejores




                              DAI - Ing. Arturo Rozas Huacho   12
Sistemas de Base de Datos

 4.3- Cursores…(Ejemplo 3)

Se tienen las siguientes tablas

#Calificacion ( Cod_CP, Cod_Postulante, Nota )

Vacantes (Cod_CP, Nro_Vacantes )


Determinar la relación de ingresantes

#Ingresantes ( Nro, Cod_CP, Cod_Postulante, Nota )




                            DAI - Ing. Arturo Rozas Huacho   13
Sistemas de Base de Datos

4.3- Cursores…(Ejemplo 3)
 -- Crear tabla de ingresantes
 SELECT TOP 0 Nro = 0, *
   INTO #Ingresantes
   FROM #CALIFICACION

 -- Declarar variables para el cursor
 DECLARE @Nro int,
         @Cod_Postulante varchar(8),
         @Cod_CP varchar(2),
         @Nota numeric(15,6),
         @Nro_Vacantes int,
         @Cod_CP_Aux varchar(2),
         @NotaUltimoIngresante numeric(15,6)
 -- Inicializar Variables auxiliares
 set @Cod_CP_Aux = '';




                      DAI - Ing. Arturo Rozas Huacho   14
Sistemas de Base de Datos

4.3- Cursores…(Ejemplo 3)
 -- Crear Cursor
 DECLARE cu_Ingresantes CURSOR
     FOR SELECT Cod_CP, Cod_Postulante, Nota
           FROM #CALIFICACION
          ORDER BY Cod_CP, Nota desc
 -- Abrir Cursor
 OPEN cu_Ingresantes
 -- Recuperar la primera tupla
 FETCH NEXT FROM cu_Ingresantes
   INTO @Cod_CP, @Cod_Postulante, @Nota,




                      DAI - Ing. Arturo Rozas Huacho   15
Sistemas de Base de Datos

4.3- Cursores…(Ejemplo 3)
 -- Procesar cada tupla
 WHILE @@FETCH_STATUS = 0
 BEGIN
   -- Determinar si se cambia de carrera
   IF @Cod_CP_Aux <> @Cod_CP
   BEGIN
     -- Recuperar Nro de vacantes de la carrera
     SELECT @Nro_Vacantes = Nro_Vacantes
        FROM VACANTES
        WHERE Cod_CP = @Cod_CP
     -- Inicializar contador
     set @Nro = 1;
     -- Actualizar variables auxiliares
     set @Cod_CP_Aux = @Cod_CP
     set @NotaUltimoIngresante = 0;
   END
   ELSE
     set @Nro = @Nro + 1;

                      DAI - Ing. Arturo Rozas Huacho   16
Sistemas de Base de Datos

4.3- Cursores…(Ejemplo 3)
  -- Verificar si es o no ingresante
   IF (@Nro <= @Nro_Vacantes) OR
      (@NOTA = @NotaUltimoIngresante)
   BEGIN
     -- Agregar a la tabla de ingresantes
     INSERT INTO #INGRESANTES
        VALUE(@Nro, @Cod_CP, @Cod_Postulante, @Nota)
     -- Guardar la nota del ultimo ingresante
     set @NotaUltimoIngresante = @Nota;
   END;
   -- Actualizar Cod_CP
   set @Cod_CP_Aux = @Cod_CP;
   -- Recuperar la siguiente tupla
   FETCH NEXT FROM cu_Ingresantes
     INTO @Cod_CP, @Cod_Postulante, @Nota,
 END




                       DAI - Ing. Arturo Rozas Huacho   17
Sistemas de Base de Datos

4.3- Cursores…(Ejemplo 3)
 -- Cerrar el cursor
 CLOSE cu_Ingresantes
 DEALLOCATE cu_Ingresantes
 -- Retornar la información solicitada
 SELECT *
   FROM #Ingresantes




                      DAI - Ing. Arturo Rozas Huacho   18

Contenu connexe

Tendances

BASE DE DATOS (modelo jerárquico - diagrama entidad-relación
BASE DE DATOS (modelo jerárquico - diagrama entidad-relación BASE DE DATOS (modelo jerárquico - diagrama entidad-relación
BASE DE DATOS (modelo jerárquico - diagrama entidad-relación Jersson Marquinho Roldan Lopez
 
Historia de la tecnologia de base de datos
Historia de la tecnologia de base de datosHistoria de la tecnologia de base de datos
Historia de la tecnologia de base de datosralbarracin
 
Diapositivas Modelo Relacional
Diapositivas Modelo RelacionalDiapositivas Modelo Relacional
Diapositivas Modelo RelacionalWiliam Perez
 
Presentación tcp y udp
Presentación tcp y udpPresentación tcp y udp
Presentación tcp y udpgonsu90
 
PROLOG: Database Manipulation In Prolog
PROLOG: Database Manipulation In PrologPROLOG: Database Manipulation In Prolog
PROLOG: Database Manipulation In PrologDataminingTools Inc
 
Estructura de Datos - Unidad III Estructuras Lineales
Estructura de Datos - Unidad III Estructuras LinealesEstructura de Datos - Unidad III Estructuras Lineales
Estructura de Datos - Unidad III Estructuras LinealesJosé Antonio Sandoval Acosta
 
Clases de direcciones IP
Clases de direcciones IPClases de direcciones IP
Clases de direcciones IPf_lazarte
 
Programación 3: listas y conjuntos en java
Programación 3: listas y conjuntos en javaProgramación 3: listas y conjuntos en java
Programación 3: listas y conjuntos en javaAngel Vázquez Patiño
 
Nat y enmascaramiento IP
Nat y enmascaramiento IPNat y enmascaramiento IP
Nat y enmascaramiento IPnyanko0018
 
Unidad 1. Fundamentos de Base de Datos
Unidad 1. Fundamentos de Base de DatosUnidad 1. Fundamentos de Base de Datos
Unidad 1. Fundamentos de Base de Datoshugodanielgd
 

Tendances (20)

DIRECCIONAMIENTO IP: IPv4 y IPv6
DIRECCIONAMIENTO  IP: IPv4 y IPv6DIRECCIONAMIENTO  IP: IPv4 y IPv6
DIRECCIONAMIENTO IP: IPv4 y IPv6
 
Base de datos
Base de datosBase de datos
Base de datos
 
Protocolos de red
Protocolos de redProtocolos de red
Protocolos de red
 
BASE DE DATOS (modelo jerárquico - diagrama entidad-relación
BASE DE DATOS (modelo jerárquico - diagrama entidad-relación BASE DE DATOS (modelo jerárquico - diagrama entidad-relación
BASE DE DATOS (modelo jerárquico - diagrama entidad-relación
 
Grafos Ponderados
Grafos PonderadosGrafos Ponderados
Grafos Ponderados
 
Historia de la tecnologia de base de datos
Historia de la tecnologia de base de datosHistoria de la tecnologia de base de datos
Historia de la tecnologia de base de datos
 
Diapositivas Modelo Relacional
Diapositivas Modelo RelacionalDiapositivas Modelo Relacional
Diapositivas Modelo Relacional
 
Clasificación de Redes
Clasificación de RedesClasificación de Redes
Clasificación de Redes
 
Presentación tcp y udp
Presentación tcp y udpPresentación tcp y udp
Presentación tcp y udp
 
Rfc2460 es
Rfc2460 esRfc2460 es
Rfc2460 es
 
PROLOG: Database Manipulation In Prolog
PROLOG: Database Manipulation In PrologPROLOG: Database Manipulation In Prolog
PROLOG: Database Manipulation In Prolog
 
Estructura de Datos - Unidad III Estructuras Lineales
Estructura de Datos - Unidad III Estructuras LinealesEstructura de Datos - Unidad III Estructuras Lineales
Estructura de Datos - Unidad III Estructuras Lineales
 
Clases de direcciones IP
Clases de direcciones IPClases de direcciones IP
Clases de direcciones IP
 
Programación 3: listas y conjuntos en java
Programación 3: listas y conjuntos en javaProgramación 3: listas y conjuntos en java
Programación 3: listas y conjuntos en java
 
Nat y enmascaramiento IP
Nat y enmascaramiento IPNat y enmascaramiento IP
Nat y enmascaramiento IP
 
concepto de estructuras de datos
concepto de estructuras de datosconcepto de estructuras de datos
concepto de estructuras de datos
 
Estructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no linealesEstructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no lineales
 
Pilas en Java
Pilas en JavaPilas en Java
Pilas en Java
 
C pointers
C pointersC pointers
C pointers
 
Unidad 1. Fundamentos de Base de Datos
Unidad 1. Fundamentos de Base de DatosUnidad 1. Fundamentos de Base de Datos
Unidad 1. Fundamentos de Base de Datos
 

En vedette

Conexion a la base de datos
Conexion a la base de datosConexion a la base de datos
Conexion a la base de datosOscSoft
 
Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)José Toro
 
Commit&rollback
Commit&rollbackCommit&rollback
Commit&rollbackArchCHUZ
 
Procedimientos Almacenados
Procedimientos AlmacenadosProcedimientos Almacenados
Procedimientos Almacenadosiluijo
 
Transacciones en MySQL
Transacciones en MySQLTransacciones en MySQL
Transacciones en MySQLThekavenet
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejerciciostestgrupocomex
 

En vedette (8)

Conexion a la base de datos
Conexion a la base de datosConexion a la base de datos
Conexion a la base de datos
 
Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)
 
Commit&rollback
Commit&rollbackCommit&rollback
Commit&rollback
 
Procedimientos Almacenados
Procedimientos AlmacenadosProcedimientos Almacenados
Procedimientos Almacenados
 
Procedimientos almacenados en MySQL
Procedimientos almacenados en MySQLProcedimientos almacenados en MySQL
Procedimientos almacenados en MySQL
 
Transacciones en MySQL
Transacciones en MySQLTransacciones en MySQL
Transacciones en MySQL
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejercicios
 
Transacciones
TransaccionesTransacciones
Transacciones
 

Similaire à Cursores

7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql ServerCorfapo
 
Manualitosqlserver
ManualitosqlserverManualitosqlserver
ManualitosqlserverOca srl
 
Trabajo final
Trabajo finalTrabajo final
Trabajo finalgmr979
 
Informe tecnicou1
Informe tecnicou1Informe tecnicou1
Informe tecnicou1Aristo1
 
IC - Estructuras de Secuencia - Ejercicios
IC - Estructuras de Secuencia - EjerciciosIC - Estructuras de Secuencia - Ejercicios
IC - Estructuras de Secuencia - Ejercicioscbertolotti
 
Programacion fantasticos
Programacion  fantasticosProgramacion  fantasticos
Programacion fantasticosBrenda Jazmin
 
Enunc tp350-2017-1
Enunc tp350-2017-1Enunc tp350-2017-1
Enunc tp350-2017-1Pablo Mora
 
Trabajo final programacion
Trabajo final programacionTrabajo final programacion
Trabajo final programacionCarlos G Mora
 
Elaborar una presentación que describa las siguientes temáticas:(1)
Elaborar una presentación que describa las siguientes temáticas:(1)Elaborar una presentación que describa las siguientes temáticas:(1)
Elaborar una presentación que describa las siguientes temáticas:(1)Victor Sanchez
 
Base datos mysql y visual basic
Base datos mysql y visual basicBase datos mysql y visual basic
Base datos mysql y visual basicRafael Tobar Jame
 
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)Videoconferencias UTPL
 
BD_L8_EXP_ROZIC_CAP9_SQL
BD_L8_EXP_ROZIC_CAP9_SQLBD_L8_EXP_ROZIC_CAP9_SQL
BD_L8_EXP_ROZIC_CAP9_SQLdemoiselle
 
Prueba Sistema Oracle
Prueba Sistema OraclePrueba Sistema Oracle
Prueba Sistema Oraclemacarena
 
IC estructuras de secuencia
IC estructuras de secuenciaIC estructuras de secuencia
IC estructuras de secuenciacbertolotti
 

Similaire à Cursores (20)

7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
 
Manualitosqlserver
ManualitosqlserverManualitosqlserver
Manualitosqlserver
 
Trabajo final
Trabajo finalTrabajo final
Trabajo final
 
ITESO
ITESOITESO
ITESO
 
Informe tecnicou1
Informe tecnicou1Informe tecnicou1
Informe tecnicou1
 
CURSORES
CURSORESCURSORES
CURSORES
 
CURSORES
CURSORESCURSORES
CURSORES
 
IC - Estructuras de Secuencia - Ejercicios
IC - Estructuras de Secuencia - EjerciciosIC - Estructuras de Secuencia - Ejercicios
IC - Estructuras de Secuencia - Ejercicios
 
Programacion fantasticos
Programacion  fantasticosProgramacion  fantasticos
Programacion fantasticos
 
Enunc tp350-2017-1
Enunc tp350-2017-1Enunc tp350-2017-1
Enunc tp350-2017-1
 
Tarea 3
Tarea 3Tarea 3
Tarea 3
 
Charla Mysql
Charla MysqlCharla Mysql
Charla Mysql
 
Trabajo final programacion
Trabajo final programacionTrabajo final programacion
Trabajo final programacion
 
Elaborar una presentación que describa las siguientes temáticas:(1)
Elaborar una presentación que describa las siguientes temáticas:(1)Elaborar una presentación que describa las siguientes temáticas:(1)
Elaborar una presentación que describa las siguientes temáticas:(1)
 
Base datos mysql y visual basic
Base datos mysql y visual basicBase datos mysql y visual basic
Base datos mysql y visual basic
 
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
 
BD_L8_EXP_ROZIC_CAP9_SQL
BD_L8_EXP_ROZIC_CAP9_SQLBD_L8_EXP_ROZIC_CAP9_SQL
BD_L8_EXP_ROZIC_CAP9_SQL
 
Prueba Sistema Oracle
Prueba Sistema OraclePrueba Sistema Oracle
Prueba Sistema Oracle
 
IC estructuras de secuencia
IC estructuras de secuenciaIC estructuras de secuencia
IC estructuras de secuencia
 
Informe tecnico de la unidad 1
Informe tecnico de la unidad 1Informe tecnico de la unidad 1
Informe tecnico de la unidad 1
 

Cursores

  • 1. Sistemas de Base de Datos 4.3- Cursores Las operaciones en una base de datos relacional se realizan sobre conjuntos de tuplas. La sentencia SELECT actúa sobre tablas y da como resultado un conjunto de tuplas (otra tabla). En muchas aplicaciones no siempre es posible trabajar adecuadamente sobre conjuntos de tuplas, sino se necesitan de mecanismos para trabajar con una tupla a la vez. Los CURSORES son una extensión del SQL que permiten procesar las tuplas de una en una. Nota.- Se recomienda que sean utilizados como ultimo recurso para la generación de consultas, en vista que consumen recursos y tiempo en el servidor. DAI - Ing. Arturo Rozas Huacho 1
  • 2. Sistemas de Base de Datos 4.3- Cursores…(Sintaxis) -- Declarar el cursor DECLARE nombre-cursor CURSOR FOR (sentencia SELECT) -- Abrir el cursor OPEN nombre-cursor -- Recuperar la primera tupla FECTH NEXT FROM nombre_cursor INTO @Variable1, @Variable2, … -- Estructura repetitiva para procesar cada tupla WHILE @@Fetch_Status = 0 begin instrucciones que procesen cada Tupla -- Recuperar siguiente tupla FECTH NEXT FROM nombre_cursor INTO @Variable1, @Variable2, … end; -- while -- Cerrar y liberar la memoria utilizada por el cursor CLOSE nombre_cursor DEALLOCATE nombre_cursor DAI - Ing. Arturo Rozas Huacho 2
  • 3. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo) Dada la siguiente base de datos: Carrera_Profesional( Cod_CP, Nombre_CP ) Alumno(Cod_Alumno, Paterno, Materno, Nombres, Cod_CP ) Docente(Cod_Docente, Paterno, Materno, Nombres, Categoria,Regimen ) Asignatura(Cod_Asignatura, Cod_CP, Nombre_Asignatura,Categoria,Creditos ) Catalogo(Semestre, Cod_Asignatura, Cod_CP, Grupo, Cod_Docente ) Matricula(Semestre, Cod_Asignatura, Cod_CP, Grupo, Cod_Alumno, Nota ) DAI - Ing. Arturo Rozas Huacho 3
  • 4. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo) Determinar la relación de asignaturas aprobadas por el alumno de código ‘980115’, con su respectivo creditaje y el acumulado de los créditos. R(Cod_Asignatura, Creditos, Cred_Acum) DAI - Ing. Arturo Rozas Huacho 4
  • 5. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 1, Variante 1) -- Crear tabla de resultados create table #CreditosAcumulados ( Cod_Asignatura varchar(5), Creditos int, Acum_Creditos int); -- Declarar el cursor DECLARE cu_CreditosAcumulados CURSOR FOR SELECT M.Cod_Asignatura, A.Creditos FROM Matricula M inner join Asignatura A ON (M.Cod_Asignatura = A.Cod_Asignatura) and (M.Cod_CP = A.Cod_CP) WHERE (M.Cod_Alumno = '980115') AND (Nota in ('11','12','13','14','15', '16','17','18','19','20')) -- Declarar variables para utilizar en el cursor DECLARE @Cod_Asignatura varchar(5), @Creditos int, @Acum_Creditos int -- Inicializar la variable @Acum_Creditos SET @Acum_Creditos = 0 DAI - Ing. Arturo Rozas Huacho 5
  • 6. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 1, Variante 1) -- Abrir el cursor OPEN cu_CreditosAcumulados -- Recuperar el primer registro en las variables FETCH NEXT FROM cu_CreditosAcumulados INTO @Cod_Asignatura, @Creditos -- Procesar cada registro WHILE @@FETCH_STATUS = 0 BEGIN -- Acumular creditaje set @Acum_Creditos = @Acum_Creditos + @Creditos; -- Insertar en tabla de resultados INSERT INTO #CreditosAcumulados values(@Cod_Asignatura, @Creditos, @Acum_Creditos) -- Recuperar siguiente registro FETCH NEXT FROM cu_CreditosAcumulados INTO @Cod_Asignatura, @Creditos END -- Cerrar el cursor CLOSE cu_CreditosAcumulados DEALLOCATE cu_CreditosAcumulados -- Mostrar en la consulta los datos solicitados SELECT * FROM #CreditosAcumulados DAI - Ing. Arturo Rozas Huacho 6
  • 7. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 1, Variante 2) -- Crear tabla de resultados declare @CreditosAcumulados table( Cod_Asignatura varchar(5), Creditos int, Acum_Creditos int); -- Declarar el cursor DECLARE cu_CreditosAcumulados CURSOR FOR SELECT M.Cod_Asignatura, A.Creditos FROM Matricula M inner join Asignatura A ON (M.Cod_Asignatura = A.Cod_Asignatura) and (M.Cod_CP = A.Cod_CP) WHERE (M.Cod_Alumno = '980115') AND (Nota in ('11','12','13','14','15', '16','17','18','19','20')) -- Declarar variables para utilizar en el cursor DECLARE @Cod_Asignatura varchar(5), @Creditos int, @Acum_Creditos int -- Inicializar la variable @Acum_Creditos SET @Acum_Creditos = 0 DAI - Ing. Arturo Rozas Huacho 7
  • 8. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 1, Variante 2) -- Abrir el cursor OPEN cu_CreditosAcumulados -- Recuperar los valores de la primera tupla FETCH NEXT FROM cu_CreditosAcumulados INTO @Cod_Asignatura,@Creditos -- Procesar cada tupla WHILE @@FETCH_STATUS = 0 BEGIN -- Acumular creditaje set @Acum_Creditos = @Acum_Creditos + @Creditos; -- Insertar en tabla de resultados INSERT INTO @CreditosAcumulados values(@Cod_Asignatura, @Creditos, @Acum_Creditos) -- Recuperar valores de la siguiente tupla FETCH NEXT FROM cu_CreditosAcumulados INTO @Cod_Asignatura, @Creditos END -- Cerrar el cursor CLOSE cu_CreditosAcumulados DEALLOCATE cu_CreditosAcumulados -- Mostrar en la consulta los datos solicitados SELECT * FROM @CreditosAcumulados DAI - Ing. Arturo Rozas Huacho 8
  • 9. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 2) Asumiendo que en procesos previos se obtuvo la siguiente Tabla: #Alumno(Cod_Alumno, Nombres, Cod_CP, Promedio ) Determinar los dos mejores estudiantes de cada carrera profesional: DAI - Ing. Arturo Rozas Huacho 9
  • 10. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 2) -- Crear tabla de resultados declare @Mejores table( Nro int, Cod_Alumno varchar(6), Nombres varchar(40), Cod_CP varchar(2), Promedio Numeric(15,2)); -- Declarar el cursor DECLARE cu_MejoresCURSOR FOR SELECT Cod_Alumno, Nombres, Cod_CP, Promedio FROM #Alumno SORT BY Cod_CP, Promedio DESC -- Declarar variables para utilizar en el cursor DECLARE @Nro int, @Cod_Alumno varchar(6), @Nombres varchar(40), @Cod_CP varchar(2), @Promedio Numeric(15,2), @Cod_CP_Aux varchar(2) DAI - Ing. Arturo Rozas Huacho 10
  • 11. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 2) -- Inicializar la variable @Acum_Creditos SET @Nro = 0; SET @Cod_CP_Aux = ’’; -- Abrir el cursor OPEN cu_Mejores -- Recuperar los valores de la primera tupla FETCH NEXT FROM cu_Mejores INTO @Cod_Alumno, @Nombres, @Cod_CP, @Promedio -- Procesar cada tupla WHILE @@FETCH_STATUS = 0 BEGIN -- Incrementar o Inicializar contador IF (@Cod_CP_AUX = @Cod_CP) set @Nro = @Nro + 1; ELSE set @Nro = 1; -- Insertar en tabla de resultados IF (@Nro <= 2) INSERT INTO @Mejores values(@Nro, @Cod_Alumno, @Nombres, @Cod_CP, @Promedio); set @Cod_CP_AUX = @Cod_CP; -- Recuperar valores de la siguiente tupla FETCH NEXT FROM cu_Mejores INTO @Cod_Alumno, @Nombres, @Cod_CP, @Promedio END DAI - Ing. Arturo Rozas Huacho 11
  • 12. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 2) -- Cerrar el cursor CLOSE cu_Mejores DEALLOCATE cu_Mejores -- Mostrar en la consulta los datos solicitados SELECT * FROM @Mejores DAI - Ing. Arturo Rozas Huacho 12
  • 13. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 3) Se tienen las siguientes tablas #Calificacion ( Cod_CP, Cod_Postulante, Nota ) Vacantes (Cod_CP, Nro_Vacantes ) Determinar la relación de ingresantes #Ingresantes ( Nro, Cod_CP, Cod_Postulante, Nota ) DAI - Ing. Arturo Rozas Huacho 13
  • 14. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 3) -- Crear tabla de ingresantes SELECT TOP 0 Nro = 0, * INTO #Ingresantes FROM #CALIFICACION -- Declarar variables para el cursor DECLARE @Nro int, @Cod_Postulante varchar(8), @Cod_CP varchar(2), @Nota numeric(15,6), @Nro_Vacantes int, @Cod_CP_Aux varchar(2), @NotaUltimoIngresante numeric(15,6) -- Inicializar Variables auxiliares set @Cod_CP_Aux = ''; DAI - Ing. Arturo Rozas Huacho 14
  • 15. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 3) -- Crear Cursor DECLARE cu_Ingresantes CURSOR FOR SELECT Cod_CP, Cod_Postulante, Nota FROM #CALIFICACION ORDER BY Cod_CP, Nota desc -- Abrir Cursor OPEN cu_Ingresantes -- Recuperar la primera tupla FETCH NEXT FROM cu_Ingresantes INTO @Cod_CP, @Cod_Postulante, @Nota, DAI - Ing. Arturo Rozas Huacho 15
  • 16. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 3) -- Procesar cada tupla WHILE @@FETCH_STATUS = 0 BEGIN -- Determinar si se cambia de carrera IF @Cod_CP_Aux <> @Cod_CP BEGIN -- Recuperar Nro de vacantes de la carrera SELECT @Nro_Vacantes = Nro_Vacantes FROM VACANTES WHERE Cod_CP = @Cod_CP -- Inicializar contador set @Nro = 1; -- Actualizar variables auxiliares set @Cod_CP_Aux = @Cod_CP set @NotaUltimoIngresante = 0; END ELSE set @Nro = @Nro + 1; DAI - Ing. Arturo Rozas Huacho 16
  • 17. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 3) -- Verificar si es o no ingresante IF (@Nro <= @Nro_Vacantes) OR (@NOTA = @NotaUltimoIngresante) BEGIN -- Agregar a la tabla de ingresantes INSERT INTO #INGRESANTES VALUE(@Nro, @Cod_CP, @Cod_Postulante, @Nota) -- Guardar la nota del ultimo ingresante set @NotaUltimoIngresante = @Nota; END; -- Actualizar Cod_CP set @Cod_CP_Aux = @Cod_CP; -- Recuperar la siguiente tupla FETCH NEXT FROM cu_Ingresantes INTO @Cod_CP, @Cod_Postulante, @Nota, END DAI - Ing. Arturo Rozas Huacho 17
  • 18. Sistemas de Base de Datos 4.3- Cursores…(Ejemplo 3) -- Cerrar el cursor CLOSE cu_Ingresantes DEALLOCATE cu_Ingresantes -- Retornar la información solicitada SELECT * FROM #Ingresantes DAI - Ing. Arturo Rozas Huacho 18