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;/

Entradas relacionadas: