Skip to content

Latest commit

 

History

History
258 lines (214 loc) · 7.89 KB

File metadata and controls

258 lines (214 loc) · 7.89 KB

Practica 10 - Registros, Arrays y cursores

Realizar los siguientes ejercicios de PL/SQL:

  1. Crea un tipo de dato compuesto que contengan los campos necesarios para guardar registros de tipo viaje (id, destino, dias, precio)**

  2. Rellena dos registros con datos introducidos por el usuario.

  3. Mostrar en pantalla el contenido de ambos registros.

  4. Crea un tipo de dato compuesto para registros de tipo viaje y añade dos viajes. El programa tiene que comparar los precios, indicar cuál es el más barato y decir qué porcentaje de ahorro tiene respecto al otro. Por ejemplo: el viaje 1 es un 10% más económico que el viaje 2.

  5. Crea un tipo de array de 20 números, que se rellenarán con valores aleatorios entre 0 y 10. Después mostrar los que tengan un valor igual o mayor a 9 e indicar el porcentaje total de números en ese rango.

  6. Crea una tabla empleados(id, nombre, apellidos, departamento, salario).

  7. Haz un cursor que recorra los empleados con salario mayor a 3000 y muestre su nombre, su departamento y su salario.

  8. Crea un tipo de dato compuesto que contengan los campos necesarios para guardar registros de tipo viaje (id, destino, dias, precio).

DECLARE
  TYPE Viaje IS RECORD (
    id       VARCHAR2(20),
    destino  VARCHAR2(100),
    dias     NUMBER,
    precio   NUMBER(10, 2)
  );

  viaje1 Viaje;
BEGIN
  -- Asignación de valores
  viaje1.id := 'V001';
  viaje1.destino := 'Barcelona';
  viaje1.dias := 5;
  viaje1.precio := 450.75;

  -- Ejemplo de uso (salida por consola)
  DBMS_OUTPUT.PUT_LINE('Destino: ' || viaje1.destino || 
                       ', Días: ' || viaje1.dias || 
                       ', Precio: ' || viaje1.precio);
END;
  1. Rellena dos registros con datos introducidos por el usuario.
DECLARE
  TYPE Viaje IS RECORD (
    id       VARCHAR2(20),
    destino  VARCHAR2(100),
    dias     NUMBER,
    precio   NUMBER(10, 2)
  );

  viaje1 Viaje;
  viaje2 Viaje;

BEGIN
  -- Entrada de datos para el primer viaje
  viaje1.id := '&ID1';
  viaje1.destino := '&DESTINO1';
  viaje1.dias := &DIAS1;
  viaje1.precio := &PRECIO1;

  -- Entrada de datos para el segundo viaje
  viaje2.id := '&ID2';
  viaje2.destino := '&DESTINO2';
  viaje2.dias := &DIAS2;
  viaje2.precio := &PRECIO2;

  -- Mostrar los datos ingresados
  DBMS_OUTPUT.PUT_LINE('--- VIAJE 1 ---');
  DBMS_OUTPUT.PUT_LINE('ID: ' || viaje1.id);
  DBMS_OUTPUT.PUT_LINE('Destino: ' || viaje1.destino);
  DBMS_OUTPUT.PUT_LINE('Días: ' || viaje1.dias);
  DBMS_OUTPUT.PUT_LINE('Precio: ' || viaje1.precio);

  DBMS_OUTPUT.PUT_LINE('--- VIAJE 2 ---');
  DBMS_OUTPUT.PUT_LINE('ID: ' || viaje2.id);
  DBMS_OUTPUT.PUT_LINE('Destino: ' || viaje2.destino);
  DBMS_OUTPUT.PUT_LINE('Días: ' || viaje2.dias);
  DBMS_OUTPUT.PUT_LINE('Precio: ' || viaje2.precio);
END;
  1. Mostrar en pantalla el contenido de ambos registros.
SET SERVEROUTPUT ON;

DECLARE
  TYPE Viaje IS RECORD (
    id       VARCHAR2(20),
    destino  VARCHAR2(100),
    dias     NUMBER,
    precio   NUMBER(10, 2)
  );

  viaje1 Viaje;
  viaje2 Viaje;

BEGIN
  -- Entrada de datos para el primer viaje
  viaje1.id := '&ID1';
  viaje1.destino := '&DESTINO1';
  viaje1.dias := &DIAS1;
  viaje1.precio := &PRECIO1;

  -- Entrada de datos para el segundo viaje
  viaje2.id := '&ID2';
  viaje2.destino := '&DESTINO2';
  viaje2.dias := &DIAS2;
  viaje2.precio := &PRECIO2;

  -- Mostrar datos del primer viaje
  DBMS_OUTPUT.PUT_LINE('--- VIAJE 1 ---');
  DBMS_OUTPUT.PUT_LINE('ID: ' || viaje1.id);
  DBMS_OUTPUT.PUT_LINE('Destino: ' || viaje1.destino);
  DBMS_OUTPUT.PUT_LINE('Días: ' || viaje1.dias);
  DBMS_OUTPUT.PUT_LINE('Precio: ' || viaje1.precio);

  -- Mostrar datos del segundo viaje
  DBMS_OUTPUT.PUT_LINE('--- VIAJE 2 ---');
  DBMS_OUTPUT.PUT_LINE('ID: ' || viaje2.id);
  DBMS_OUTPUT.PUT_LINE('Destino: ' || viaje2.destino);
  DBMS_OUTPUT.PUT_LINE('Días: ' || viaje2.dias);
  DBMS_OUTPUT.PUT_LINE('Precio: ' || viaje2.precio);
END;
  1. Crea un tipo de dato compuesto para registros de tipo viaje y añade dos viajes. El programa tiene que comparar los precios, indicar cuál es el más barato y decir qué porcentaje de ahorro tiene respecto al otro. Por ejemplo: el viaje 1 es un 10% más económico que el viaje 2.
SET SERVEROUTPUT ON;

DECLARE
  TYPE Viaje IS RECORD (
    id       VARCHAR2(20),
    destino  VARCHAR2(100),
    dias     NUMBER,
    precio   NUMBER(10, 2)
  );

  viaje1 Viaje;
  viaje2 Viaje;

  diferencia NUMBER;
  porcentaje_ahorro NUMBER;

BEGIN
  -- Entrada de datos para el primer viaje
  viaje1.id := '&ID1';
  viaje1.destino := '&DESTINO1';
  viaje1.dias := &DIAS1;
  viaje1.precio := &PRECIO1;

  -- Entrada de datos para el segundo viaje
  viaje2.id := '&ID2';
  viaje2.destino := '&DESTINO2';
  viaje2.dias := &DIAS2;
  viaje2.precio := &PRECIO2;

  -- Mostrar los datos ingresados
  DBMS_OUTPUT.PUT_LINE('--- VIAJE 1 ---');
  DBMS_OUTPUT.PUT_LINE('Destino: ' || viaje1.destino || ', Precio: ' || viaje1.precio);
  DBMS_OUTPUT.PUT_LINE('--- VIAJE 2 ---');
  DBMS_OUTPUT.PUT_LINE('Destino: ' || viaje2.destino || ', Precio: ' || viaje2.precio);

  -- Comparación de precios
  IF viaje1.precio < viaje2.precio THEN
    diferencia := viaje2.precio - viaje1.precio;
    porcentaje_ahorro := (diferencia / viaje2.precio) * 100;
    DBMS_OUTPUT.PUT_LINE('El viaje 1 es más económico que el viaje 2.');
    DBMS_OUTPUT.PUT_LINE('Ahorro: ' || ROUND(porcentaje_ahorro, 2) || '%');
  ELSIF viaje2.precio < viaje1.precio THEN
    diferencia := viaje1.precio - viaje2.precio;
    porcentaje_ahorro := (diferencia / viaje1.precio) * 100;
    DBMS_OUTPUT.PUT_LINE('El viaje 2 es más económico que el viaje 1.');
    DBMS_OUTPUT.PUT_LINE('Ahorro: ' || ROUND(porcentaje_ahorro, 2) || '%');
  ELSE
    DBMS_OUTPUT.PUT_LINE('Ambos viajes tienen el mismo precio.');
  END IF;
END;
  1. Crea un tipo de array de 20 números, que se rellenarán con valores aleatorios entre 0 y 10. Después mostrar los que tengan un valor igual o mayor a 9 e indicar el porcentaje total de números en ese rango.
SET SERVEROUTPUT ON;

DECLARE
  -- Tipo de array de 20 números
  TYPE ArrayNumeros IS VARRAY(20) OF NUMBER;

  numeros ArrayNumeros := ArrayNumeros();
  contador NUMBER := 0;
  i NUMBER;
  porcentaje NUMBER;

BEGIN
  -- Rellenar el array con números aleatorios entre 0 y 10
  FOR i IN 1..20 LOOP
    numeros.EXTEND;
    numeros(i) := TRUNC(DBMS_RANDOM.VALUE(0, 11)); -- TRUNC para obtener entero de 0 a 10
  END LOOP;

  -- Mostrar los números mayores o iguales a 9
  DBMS_OUTPUT.PUT_LINE('Números mayores o iguales a 9:');
  FOR i IN 1..20 LOOP
    IF numeros(i) >= 9 THEN
      DBMS_OUTPUT.PUT_LINE('Posición ' || i || ': ' || numeros(i));
      contador := contador + 1;
    END IF;
  END LOOP;

  -- Calcular y mostrar el porcentaje
  porcentaje := (contador / 20) * 100;
  DBMS_OUTPUT.PUT_LINE('Total de números >= 9: ' || contador);
  DBMS_OUTPUT.PUT_LINE('Porcentaje: ' || ROUND(porcentaje, 2) || '%');
END;
  1. Crea una tabla empleados(id, nombre, apellidos, departamento, salario).
CREATE TABLE empleados (
  id           NUMBER PRIMARY KEY,
  nombre       VARCHAR2(50),
  apellidos    VARCHAR2(100),
  departamento VARCHAR2(50),
  salario      NUMBER(10, 2)
);
  1. Haz un cursor que recorra los empleados con salario mayor a 3000 y muestre su nombre, su departamento y su salario.
SET SERVEROUTPUT ON;

DECLARE
  -- Definición del cursor
    SELECT nombre, departamento, salario
    FROM empleados
    WHERE salario > 3000;

  -- Variables para almacenar los valores del cursor
  v_nombre empleados.nombre%TYPE;
  v_departamento empleados.departamento%TYPE;
  v_salario empleados.salario%TYPE;

BEGIN
  OPEN empleados_cursor;

  LOOP
    FETCH empleados_cursor INTO v_nombre, v_departamento, v_salario;
    EXIT WHEN empleados_cursor%NOTFOUND;

    -- Mostrar la información
    DBMS_OUTPUT.PUT_LINE('Nombre: ' || v_nombre ||
                         ', Departamento: ' || v_departamento ||
                         ', Salario: ' || v_salario);
  END LOOP;

  CLOSE empleados_cursor;
END;