Add PL/SQL exam.

This commit is contained in:
Nicolás A. Ortega Froysa 2022-05-18 18:16:05 +02:00
parent 9e80b532f2
commit fccb211da1
4 changed files with 151 additions and 0 deletions

View File

@ -0,0 +1,40 @@
SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION calculoAreas(shape VARCHAR, nums VARCHAR) RETURN INT
IS
figuraNoValida EXCEPTION;
width INT := 1;
height INT := 1;
res INT := -1;
BEGIN
IF shape = 'triángulo' THEN
width := TO_NUMBER(SUBSTR(nums, 1, INSTR(nums, ',') - 1));
height := TO_NUMBER(SUBSTR(nums, INSTR(nums, ',') + 1));
res := width * height / 2;
ELSIF shape = 'cuadrado' THEN
width := TO_NUMBER(nums);
res := nums * nums;
ELSIF shape = 'círculo' THEN
width := TO_NUMBER(nums);
res := 3.1415 * width * width;
ELSE
RAISE figuraNoValida;
END IF;
RETURN res;
EXCEPTION
WHEN figuraNoValida THEN
dbms_output.put_line('Nombre de figura no válida, debes usar sólo triángulo, cuadrado, o círculo.');
RETURN -1;
END;
/
DECLARE
res INT;
BEGIN
res := calculoAreas('triángulo', '4,2');
dbms_output.put_line('Triángulo de b=4 y a=2: ' || res);
res := calculoAreas('círculo', '3');
dbms_output.put_line('Círculo de r=3: ' || res);
END;
/

View File

@ -0,0 +1,30 @@
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE insertarDepartamento(
deptName dept.dname%type, deptLocale dept.loc%type, message OUT VARCHAR)
IS
items INT;
nextId dept.deptno%type;
BEGIN
SELECT COUNT(*) INTO items FROM dept WHERE dname=deptName;
IF items > 0 THEN
message := 'El departamento no se ha creado, ya existe.';
ELSE
SELECT MAX(deptno) INTO nextId FROM dept;
nextId := nextId + 10;
INSERT INTO dept(deptno, dname, loc) VALUES(nextId, deptName, deptLocale);
message := 'Se ha insertado el nuevo departamento.';
END IF;
END;
/
DECLARE
msg VARCHAR(128);
items INT;
BEGIN
insertarDepartamento('MARKETING', 'DETROIT', msg);
dbms_output.put_line(msg);
insertarDepartamento('QUALITY', 'LOS ANGELES', msg);
dbms_output.put_line(msg);
END;
/

View File

@ -0,0 +1,38 @@
SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION obtenerTrabajadoresJob(empJob emp.job%type) RETURN INT
IS
CURSOR jobEmps IS SELECT empno, ename FROM emp WHERE job=empJob;
counter INT := 0;
empId emp.empno%type;
empName emp.ename%type;
BEGIN
OPEN jobEmps;
LOOP
FETCH jobEmps INTO empId, empName;
EXIT WHEN jobEmps%notfound;
dbms_output.put_line(empId || ' ' || empName);
counter := counter + 1;
END LOOP;
CLOSE jobEmps;
IF counter = 0 THEN
RAISE NO_DATA_FOUND;
END IF;
RETURN counter;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('No existe ese valor para puesto en la tabla EMP.');
RETURN 0;
END;
/
DECLARE
cnt INT;
BEGIN
cnt := obtenerTrabajadoresJob('MANAGER');
dbms_output.put_line(cnt);
cnt := obtenerTrabajadoresJob('SYSTEM');
dbms_output.put_line(cnt);
END;
/

View File

@ -0,0 +1,43 @@
1.1 Crea una función calculoAreas a la que se le pasen dos parámetros: (2.25 puntos)
Nombre de la figura geométrica (VARCHAR): triángulo, cuadrado, círculo.
Parámetro con la siguiente estructura:
Para el triángulo, un VARCHAR con base y altura separado con una coma. Ej.: 7,3.
Para el cuadrado, el lado.
Para el círculo, el valor del radio.
Si se pasa como nombre de la figura algo diferente a triángulo, cuadrado, círculo, debes crear una excepción que se llame figuraNoValida y que muestre por pantalla el mensaje “Nombre de figura no válida, debes usar solo triángulo, cuadrado o círculo”.
NOTA: recuerda que para realizar operaciones matemáticas el tipo de dato debe ser numérico (función TO_NUMBER).
NOTA 2: el área de un triángulo es base por altura. El área de un cuadrado es lado por lado. El área de un círculo es PI por radio al cuadrado. El valor de PI es 3.1415.
1.2 Llama a la función calculoAreas con un triángulo de base 4 y altura 2. Después, haz lo mismo con un círculo de radio 3. (0.75 puntos)
2.1. Crea un procedimiento que se llame insertarDepartamento que pida como parámetros de entrada el nombre del departamento y la localidad. Debes incluir también un parámetro de salida llamado mensaje donde debes guardar el mensaje de éxito o fracaso al crear el departamento. (2.25 puntos)
El objetivo de este procedimiento es que compruebe si existe un departamento (DNAME) con ese mismo nombre, y si es así, que devuelva en mensaje “El departamento no se ha creado, ya existe”. En el caso de que no exista, insertar un registro en la tabla DEPT con los siguientes valores:
DEPTNO: el valor del último registro añadido (valor más alto de deptno) incrementado en 10.
DNAME: nombre del departamento pasado como primer parámetro al procedimiento.
LOC: localidad pasada como segundo parámetro al procedimiento.
NOTA: La localidad (LOC) se puede repetir sin problemas.
2.2. Crea un bloque de código anónimo que llame a dicho procedimiento con los siguientes valores: (0.75 puntos)
3.1. Se quiere crear una función que se llame obtenerTrabajadoresJob que reciba por parámetro el puesto (JOB) que se quiere consultar de la tabla EMP, y realice lo siguiente: (3 puntos)
Si existe el valor de JOB en la tabla EMP, mostrar por pantalla el EMPNO y ENAME de cada trabajador con dicho puesto en una línea diferente. Una vez terminado, la función debe devolver el número total de empleados con ese JOB.
Si no existe el valor de JOB en la tabla EMP, controlarlo mediante una excepción (NO_DATA FOUND, OTHERS, o una propia que creéis) que muestre por pantalla “No existe ese valor para puesto en la tabla EMP”. La función debe devolver cero en este caso.
3.2. Crear un bloque de código anónimo que llame a la función obtenerTrabajadoresJob con las siguientes llamadas: (1 punto)
JOB vale MANAGER.
JOB vale SYSTEM.
Debe mostrarse por pantalla el número total de trabajadores de ese puesto, valor que devuelve la función obtenerTrabajadoresJob.