From fccb211da1dd3c83a40d8ebc4ddcbef6b94a3bdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Ortega=20Froysa?= Date: Wed, 18 May 2022 18:16:05 +0200 Subject: [PATCH] Add PL/SQL exam. --- 1/GBD/examen-plsql/ej1.sql | 40 ++++++++++++++++++++++++++++ 1/GBD/examen-plsql/ej2.sql | 30 +++++++++++++++++++++ 1/GBD/examen-plsql/ej3.sql | 38 +++++++++++++++++++++++++++ 1/GBD/examen-plsql/enunciados.txt | 43 +++++++++++++++++++++++++++++++ 4 files changed, 151 insertions(+) create mode 100644 1/GBD/examen-plsql/ej1.sql create mode 100644 1/GBD/examen-plsql/ej2.sql create mode 100644 1/GBD/examen-plsql/ej3.sql create mode 100644 1/GBD/examen-plsql/enunciados.txt diff --git a/1/GBD/examen-plsql/ej1.sql b/1/GBD/examen-plsql/ej1.sql new file mode 100644 index 0000000..0ce0f2d --- /dev/null +++ b/1/GBD/examen-plsql/ej1.sql @@ -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; +/ diff --git a/1/GBD/examen-plsql/ej2.sql b/1/GBD/examen-plsql/ej2.sql new file mode 100644 index 0000000..923072a --- /dev/null +++ b/1/GBD/examen-plsql/ej2.sql @@ -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; +/ diff --git a/1/GBD/examen-plsql/ej3.sql b/1/GBD/examen-plsql/ej3.sql new file mode 100644 index 0000000..5bf9d48 --- /dev/null +++ b/1/GBD/examen-plsql/ej3.sql @@ -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; +/ diff --git a/1/GBD/examen-plsql/enunciados.txt b/1/GBD/examen-plsql/enunciados.txt new file mode 100644 index 0000000..b8027c9 --- /dev/null +++ b/1/GBD/examen-plsql/enunciados.txt @@ -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.