Documentos de Académico
Documentos de Profesional
Documentos de Cultura
-- CURSOR IMPLICITO
-- Creamos un bloque donde solo se selecciona un registro
DECLARE
lv_des_curso cursos.des_curso%TYPE;
lv_any_ini INT;
BEGIN
-- Seleccionar la descripción de un curso
SELECT
des_curso
INTO lv_des_curso
FROM
cursos
WHERE
any_inici = 2022
AND num_semes = 1;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No hay datos para la selección');
WHEN too_many_rows THEN
dbms_output.put_line('Mas de una dato para la selección');
END;
/
DECLARE
-- Declaramos un cursor con una operacion de nota media por asignatura
CURSOR cnotas IS
SELECT
cod_asigna,
round(AVG(fin_nota),
2) nota_media
FROM
notas
GROUP BY
cod_asigna;
END LOOP;
-- Cerramos cursor
CLOSE cnotas;
END;
/
-- WHILE + FETCH
-- Bloque anónimo devuelve el precio de cada ciclo
DECLARE
-- Declarar cursor con todas las asignaturas
CURSOR casigna IS
SELECT
cod_asigna,
cod_ciclo,
precio
FROM
asignaturas;
DECLARE
CURSOR casigna IS
SELECT
cod_asigna,
cod_ciclo,
num_horas
FROM
asignaturas;
lv_casigna casigna%rowtype;
lv_horas_dam INT DEFAULT 0;
lv_horas_daw INT DEFAULT 0;
lv_horas_smx INT DEFAULT 0;
BEGIN
FOR lv_casigna IN casigna LOOP
CASE lv_casigna.cod_ciclo
WHEN 'DAM' THEN
lv_horas_dam := lv_horas_dam + lv_casigna.num_horas;
WHEN 'DAW' THEN
lv_horas_daw := lv_horas_daw + lv_casigna.num_horas;
WHEN 'SMX' THEN
lv_horas_smx := lv_horas_smx + lv_casigna.num_horas;
END CASE;
END LOOP;
CURSOR casigna IS
SELECT
cod_asigna,
cod_ciclo,
precio
FROM
asignaturas
WHERE
cod_ciclo = ciclo;
lv_casigna casigna%rowtype;
lv_precio INT DEFAULT 0;
BEGIN
OPEN casigna;
FETCH casigna INTO lv_casigna;
WHILE casigna%found LOOP
lv_precio := lv_precio + lv_casigna.precio;
FETCH casigna INTO lv_casigna;
END LOOP;
CLOSE casigna;
RETURN lv_precio;
END precio_ciclo;
/
END;
/
-- CURSORES DE ACTUALIZACIÓN
DECLARE
-- Declara el cursor para actualizar
CURSOR cprofe IS
SELECT
profesores.nom_profe,
profesores.cod_provi,
provincias.nom_provi
FROM
profesores
INNER JOIN provincias on profesores.cod_provi = provincias.cod_provi
WHERE
profesores.cod_profe IN ( 1, 2, 3, 4, 5 )
ORDER BY profesores.cod_profe
FOR UPDATE OF profesores.cod_provi;
lv_cprofe cprofe%rowtype;
lv_nueva_provi profesores.cod_provi%TYPE;
BEGIN
lv_nueva_provi := &nueva_provi;
-- Mostrar los registros antes de la actualización
dbms_output.put_line('Valores antes de actualizarse');
OPEN cprofe;
FETCH cprofe INTO lv_cprofe;
WHILE cprofe%found LOOP
dbms_output.put_line(cprofe%rowcount
|| ') ANTES: '
|| lv_cprofe.nom_profe
|| ' - '
|| lv_cprofe.cod_provi
|| ' - '
|| lv_cprofe.nom_provi);
-- Actualizar los registros
UPDATE profesores
SET
cod_provi = lv_nueva_provi
WHERE
CURRENT OF cprofe;
lv_nueva_provi := lv_nueva_provi + 1;
FETCH cprofe INTO lv_cprofe;
END LOOP;
CLOSE cprofe;
-- Ejecuta todas las acciones del UPDATE
COMMIT;
CLOSE cprofe;
-- ROLLBACK;
END;