Recorrido por Bloques PL/SQL: Cursores, Gestión de Datos y Excepciones
Clasificado en Inglés
Escrito el en español con un tamaño de 4,44 KB
Ejemplo 35: Cursores Implícitos y Explícitos
Declaración de variables para almacenar datos de estudiantes:
DECLARE
v_idestudiante estudiantes.idestudiante%TYPE;
v_nombre estudiantes.nombre%TYPE;
v_apellido estudiantes.apellido%TYPE;
v_carrera estudiantes.carrera%TYPE := 'History';
CURSOR c_estudiantes IS
SELECT idestudiante, name, surname
FROM Students
WHERE race = v_carrera;
BEGIN
-- Identificar las filas en el conjunto activo y preparar para post-procesar los datos
OPEN c_estudiantes;
LOOP
-- Recuperar cada fila del conjunto activo en variables PL/SQL
FETCH c_estudiantes INTO v_idestudiante, v_nombre, v_apellido;
dbms_output.put_line(v_idestudiante || ' ' || v_nombre || ' ' || v_apellido);
-- Si no hay más filas para mostrar, salir del bucle
EXIT WHEN c_estudiantes%NOTFOUND;
END LOOP;
-- Liberar recursos de la consulta
CLOSE c_estudiantes;
END;
Ejemplo 36: Uso de %ROWTYPE
DECLARE
v_departamento asignaturas.departamento%TYPE;
v_asignatura asignaturas.asignatura%TYPE;
CURSOR c_asignaturas IS
SELECT *
FROM subjects;
v_registroasignaturas c_asignaturas%ROWTYPE;
BEGIN
OPEN c_asignaturas;
FETCH c_asignaturas INTO v_registroasignaturas;
dbms_output.put_line(v_registroasignaturas.departamento || ' ' || v_registroasignaturas.asignatura || ' ' || c_asignaturas%ROWCOUNT);
CLOSE c_asignaturas;
END;
Ejemplo 37: Cursores con Parámetros
DECLARE
CURSOR c_asignaturas (p_departamento asignaturas.departamento%TYPE, p_asignatura asignaturas.asignatura%TYPE) IS
SELECT *
FROM subject
WHERE department = p_departamento
AND subject = p_asignatura;
v_registroasignaturas c_asignaturas%ROWTYPE;
BEGIN
OPEN c_asignaturas('MAT', 102);
FETCH c_asignaturas INTO v_registroasignaturas;
dbms_output.put_line(v_registroasignaturas.departamento || ' ' || v_registroasignaturas.asignatura);
CLOSE c_asignaturas;
END;
Ejemplo 38: Actualización e Inserción Condicional
-- Opción 1: Usando SQL%NOTFOUND
BEGIN
UPDATE rooms
SET numero_asientos = 100
WHERE id_sala = 20001;
IF SQL%NOTFOUND THEN
INSERT INTO rooms (id_sala, numero_asientos)
VALUES (20001, 100);
END IF;
END;/
-- Opción 2: Usando SQL%ROWCOUNT
BEGIN
UPDATE rooms
SET numero_asientos = 100
WHERE id_sala = 20001;
IF SQL%ROWCOUNT = 0 THEN
INSERT INTO rooms (id_sala, numero_asientos)
VALUES (20001, 100);
END IF;
END;/
Ejemplo 39: Manejo de Excepciones NO_DATA_FOUND
DECLARE
v_datossala rooms%ROWTYPE;
BEGIN
SELECT *
INTO v_datossala
FROM rooms
WHERE id_sala = -1;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('SQL%NOTFOUND is TRUE');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND was used');
END;/
Ejemplo 40: Inserción de Datos desde un Cursor
DECLARE
v_idestudiante estudiantes.idestudiante%TYPE;
v_nombre estudiantes.nombre%TYPE;
v_apellido estudiantes.apellido%TYPE;
CURSOR c_estudiantesdehistoria IS
SELECT idestudiante, name, surname
FROM Students
WHERE race = 'History';
BEGIN
OPEN c_estudiantesdehistoria;
LOOP
FETCH c_estudiantesdehistoria INTO v_idestudiante, v_nombre, v_apellido;
EXIT WHEN c_estudiantesdehistoria%NOTFOUND;
INSERT INTO estudiantes_registrados (idestudiante, department, discipline)
VALUES (v_idestudiante, 'MAT', 102);
INSERT INTO tabla_temp (numero_columna, caracteres_columna)
VALUES (v_idestudiante, v_nombre || ' ' || v_apellido);
END LOOP;
CLOSE c_estudiantesdehistoria;
END;/
Ejemplo 41: Uso de WHILE FOUND en Cursores
DECLARE
CURSOR c_estudiantesdehistoria IS
SELECT idestudiante, name, surname
FROM Students
WHERE race = 'History';
v_datosestudiante c_estudiantesdehistoria%ROWTYPE;
BEGIN
OPEN c_estudiantesdehistoria;
FETCH c_estudiantesdehistoria INTO v_datosestudiante;
WHILE c_estudiantesdehistoria%FOUND LOOP
INSERT INTO estudiantes_registrados (idestudiante, department, subject)
VALUES (v_datosestudiante.idestudiante, 'MAT', 102);
INSERT INTO tabla_temp (numero_columna, caracteres_columna)
VALUES (v_datosestudiante.idestudiante, v_datosestudiante.nombre || ' ' || v_datosestudiante.apellido);
FETCH c_estudiantesdehistoria INTO v_datosestudiante;
END LOOP;
CLOSE c_estudiantesdehistoria;
END;/