Ejercicios Ejercicios PLSQL Índice Fundamentos ............................................................................................. 2 Cursores .................................................................................................... 2 Excepciones ............................................................................................... 2 Procedimientos ........................................................................................... 3 Funciones .................................................................................................. 4 Paquetes ................................................................................................... 4 Triggers ..................................................................................................... 5
1
Fundamentos -
Calcular la diferencia entre el número de registros de dos tablas (en abstracto)
-
Del esquema de scott deduzca si el departamento SALES tienen su correspondiente jefe ('MANAGER'). Si lo encuentra imprima su nombre por pantalla
-
Pida al usuario un id de empleado. Si existe dicho id, imprima por pantalla su nombre. En caso contrario, imprima un mensaje por pantalla 'No existe el ID xxxx' siendo el xxxx el id introducido
Cursores -
-
-
-
Crear una tabla vendedores, compuesta por tres columnas: nº empleado, salario y comisión. Hacer un programa en PL/SQL que busque a todos los empleados de la tabla emp que tengan comisión no nula e insertarlos en la tabla creada anteriormente. Actualizar los vendedores con una comisión mayor que 350$ con un incremento del 15% de su salario. Si la operación afecta a más de tres empleados, deshacer la transacción, en cualquier otro caso validar la transacción. Introducir en la tabla temp (Tabla con dos columnas: una numérica y otra de caracteres) la operación que se ha realizado. Actualizar el trabajo de un empleado a director a todos los trabajadores cuyo salario sea mayor que 2000$. Almacenar el número de empleados actualizados por la operación en temp. Si los afectados son más de cinco personas, borrar los empleados cuyo salario sea mayor de 3000$, si los afectados son más de tres personas, deshacer la transacción de cualquier cambio. En cualquier otro caso validar la transacción. Insertar 10 o más filas en la tabla temp, donde en la primera columna se insertará un índice de número secuencial (1,2,3...) y en la columna de tipo texto, un comentario indicando si el número generado es par o impar.
-
Crear una tabla MAS_ PAGADOS, compuesta de dos columnas, nombre y salario. Insertar en esa tabla los cinco empleados mejor pagados de la tabla emp.
-
Realizar un bloque PL/SQL en el cual determine el total de las ganancias de los empleados (salario y comisión) para el departamento 20. También calcular cuantos empleados tienen su salario por encima de 2000$ y también la cantidad de aquellos empleados cuya comisión es mayor que su salario. Calcular por medio de un bloque PL/SQL anónimo, el total de ganancias de los empleados (salario y comisión) para todos los departamentos. También calcular cuantos empleados tienen el salario mayor que 2000$ y también cuantos empleados tienen su comisión mayor que su salario. Almacenar el resultado en la tabla temp2 (compuesta de tres columnas, dos numéricas y otra de texto).
-
Excepciones -
Para un número de empleado dado incrementar su salario en un 10%. Deberemos preguntar el número del empleado por medio de comandos
2
-
SQL*Plus. En este bloque tendremos que controlar dos excepciones predefinidas de ORACLE, NO_DATA_FOUND y TOO_MANY_ROWS. Por medio de comandos SQL*Plus aceptaremos tres valores que correspondan a un número de departamento, un nombre de un departamento y una localidad. Realizamos un bloque PL/SQL en el cual inserte en la tabla dept los valores que hemos introducido anteriormente. Deberemos controlar los siguientes errores: Si ya existe, insertaremos en temp un error. o
o
o
Si ponemos un dato en una columna de menor longitud entonces insertamos un error en temp. Si se producen otros errores entonces insertar en temp el número y el mensaje del error.
NOTA: El error ORACLE de longitud del dato fuera del rango es el - 143 8.
-
Preguntaremos por el número de empleado con técnicas de SQL*Plus. En un bloque PL/SQL comprobaremos que si el empleado dado tiene un salario mayor o igual de 1000$, entonces actualizaremos su salario quitándole 1000$ e informaremos de la operación en la tabla temp. Si el salario que tienen es inferior a 1000$ entonces provocaremos una excepción, donde insertaremos en temp el código del empleado y el mensaje ‘ fondos insuficientes’. También deberemos controlar que no exista el empleado o
-
que haya duplicados y otros errores que no hayamos manejado. Preguntar por el nombre del empleado con técnicas de SQL*Plus. Por medio de un bloque PL/SQL sacar el salario y el nombre del empleado que se ha pedido e insertarlo en la tabla MAS_PAGADOS el nombre y el salario. Si no se encuentra el nombre insertar en temp un mensaje de error o
0, ‘ No lo encuentro’. o
o
Si hay más de uno con el mismo nombre entonces en temp varios ‘ nombre); insertaremos un error 1, ‘ Hay Si se producen varios errores entonces insertar en temp el código de error y el mensaje.
Procedimientos -
-
Crear el procedimiento quien_ejecuta, que inserte en la tabla tabla_long el nombre del usuario y la fecha de cuando se ha conectado a ORACLE. Primero deberemos crear tabla. Crear un procedimiento que actualice el salario de un empleado, pasado por parámetro, aumentándolo un porcentaje el salario que también lo introducimos como argumento. También este procedimiento debe registrar en tabla_log el usuario y la fecha que utiliza este procedimiento. Crear una función que muestre la suma de los salarios de un departamento dado por un parámetro. Invocar la función desde SQL*Plus. Utilizar los procedimientos del paquete de ORACLE, DBMS_OUTPUT para indicar en un procedimiento que calcule todos los salarios de los departamentos y que lo indique en pantalla de la siguiente manera:
Departamento : 10 Departamento : 20
-
Suma= . . . Suma= . . .
Hacer un procedimiento que se llame alta_sal_dept en la que me va a pedir un número de departamento como parámetro de entrada e insertar en la
3
tabla salario_dept (la cual se va a componer de dos campos) el número de departamento y la suma de salarios de los empleados de ese departamento.
Funciones -
Hacer una función que devuelva el salario medio de un empleado en un departamento determinado y con un trabajo determinado, estos valores se pasarán como argumentos de entrada.
Paquetes -
Crear un paquete Gestión_de_depart, en el cual se van a declarar varios procedimientos: o
o
o
Alta_dept con tres argumentos: número de departamento, nombre del departamento y localidad del departamento. Este procedimiento debe comprobar que los números de departamento va de 10 en 10, si no daría un error. Opcionalmente pondremos el parámetro de número de departamento por defecto, en cuyo caso entonces el número de departamento se obtendrá por medio de un variable privada el cual coja el próximo número de departamento posible, siguiendo las reglas pertinentes. Baja_dept con un argumento. Dado un número de departamento lo borramos. Mod_dept con dos argumentos. Dado un número de departamento actualizamos la localidad al destino que le hemos indicado en el otro parámetro.
NOTA: Habrá que inicializar la variable privada, se pueden utilizar procedimientos privados y también deberemos controlar en todos los procedimientos las excepciones que puedan surgir.
4
-
Crear un paquete Gestión_de_empresa, en el cual se van a declarar tres procedimientos: Alta_emp con tres argumentos: nombre del empleado, trabajo que de desempeña y el nombre del jefe. Este procedimiento debe insertar un empleado en la tabla emp, con todos los valores de las columnas; por lo tanto, deberemos calcular el resto de los datos. El número del empleado se obtendrá por medio de una variable privada el cual coje el próximo número de empleado posible, será el valor máximo de empleado +1. Para calcular el salario utilizaremos la función sal_medio. La fecha de alta, será la del sistema, y el departamento será el de su jefe. La comisión vendrá dada si su trabajo es de vendedor, si no es vendedor = NULL y si es vendedor = 0. o
o
o
Baja_emp con un argumento. Dado un número de empleado lo borramos. Si esta empleado es jefe de un grupo de trabajadores entonces deberemos de asignar como el jefe al del salario más alto del grupo de empleados que trabaja para el antiguo jefe. Mod_emp con dos argumentos. Dado un número de empleado actualizamos su departamento que le hemos indicado en el otro parámetro, si el departamento no existe lo crearemos utilizando algún procedimiento ya creado.
NOTA: Habrá que inicializar la variable privada, se pueden utilizar procedimientos privados y también deberemos controlar en todos los procedimientos las excepciones que puedan surgir.
Triggers -
-
Crear un trigger que guarde los valores de la tabla dept en una tabla de históricos. Hacer un disparador de base de datos sobre la tabla dept, en el cual cuando se inserte o se actualice el número de departamento, compruebe que este número sea múltiplo de diez. Crear un disparador de bases de datos en el cual cada vez que se hace una operación de modificado sobre la tabla emp, realice una actualización de la columna salario total de la tabla salario_departamentos, es decir que cuando se inserte una nueva fila, se borre o se actualice salario deberemos controlar el salario total por departamentos. Realizar un disparador de fila sobre la tabla emp que se ejecute cuando se actualiza o se inserte sobre la tabla emp, comprobar que el salario se encuentre entre el máximo y el mínimo de ese trabajo para un departamento. También deberemos comprobar que existe el departamento, si no existe habrá que crearlo. Si se modifica el departamento de un director deberemos cambiar el departamento a sus empleados.
5
6