soluciones ejercicios pl/sql

April 19, 2017 | Author: migarmi | Category: N/A
Share Embed Donate


Short Description

Download soluciones ejercicios pl/sql...

Description

Soluciones de las Prácticas

Práctica 2 Soluciones Evalúe las siguientes declaraciones. Determine cuáles de ellos no son legales, y explique por qué. Ilegal, porque sólo se permite un identificador por declaración. C. DECLARE v_birthdate DATE NOT NULL; Ilegal, porque una variable NOT NULL ha de ìnícializarse. Ilegal, porque 1 no es una expresión booleana. Desarrcllo de Aplicaciones con PL/SQL Apéndice E-2

Práctica 2 Soluciones (continuación) Determine el tipo de datos de las expresiones resultantes delas siguientes asignaciones Number Ilegal, PL/SQL no puede convertir símbolos especiales de VARCHAR2 a NUMBER Boolean Cree un bloque anónimo para imprimir la frase "My PL/SQL Block Works” en la pantalla. VARIABLE gwmessage VARCHAR2 (30) BEGIN :g_message 'My PL/SQL Block Works', END: / PRINT g__mesBage G_MESSAGE My PL/SQL Block Works Desarrollo de Aplicaciones con PLISQL Apéndice E-3

Práctica 2 Soluciones (continuación) Si tiene tiempo, realice el siguiente ejercicio. 4. Cree un bloque que declare dos variables. Asigne el valor de estas variables PL/SQL a variables SQL*Plus e imprima los rcsulßados de las vańables PL/SQL en las pantalla. Ejecute su bloque PL/SQL. Guarde su bloque Pl/ SQL en un archivo llamado p2q4..sql. VÉCHAR Character (variable length) VMNUM Number Asigne vaìores a estas variables del siguiente made 1 Variable Value V_CHAR The literal '42 is the answer' The first: two characters from VHCHAR Desarrollo de Aplicaciones con PL/SQL Apéndice

Práctica 3 Soluciones PLISQL Block Desarrollo de Aplìcacinnes con PLISQL Apéndice

Práctica 3 Soluciones (continuación) 1. Observe el bloque PL/SQL de la página anterior y determine los siguientes valores de acuerdo con las reglas de ámbito. a. El valor de Ñ/„WEIGHT en el subbloque es “2” y el tipo de dato es NUMBER. b. El valor de \/_NEWMLOCN en el subbloque es “Western Europe” y el tipo de dato es VARCHAR2. c. El valor de en el bloque pxincìpal es “601” y el tipo de dato es NUMBER. d. El valor de V_MESSAGE en el bloque principal es “Product 10012 is in stock” y el tipo de dato es VARCHAR2` e. El valor de V„NEWhLOCN en el bloque principal es Ilegal porque v„new„locn no es visible fuera del sub-bloque. Desarrollo de Aplicaciones con PLJSQL Apéndice E-6

Práctica 3 Soluciones (continuación) Ejemplo de ámbito DECLARE v_customer Womansport ; EXCELLENT Desarrollo de Aplicaciones con PL/SQL Apéndice

Práctica 3 Soluciones (continuación) 2. Suponga que embebe un subbloque en un bloque, como se mostraba en la página anterior. Declarará dos variables, V_CUSTOMER y V_CREDIT*RAT1NG, en el bloque principal. También declara' dos variables, V_CUSTOMER y V„NAME, en el subbloque. Determine los valores delos siguientes casos. a. El valor de V_,CUSTOMER en el subbloque es “201” y el tipo de dato es NUMBER. b. El valor de V_NAME en el subbloque es “Unìsparts” y el tipo de dato es VARCHAR1?.e c. El valor de V„CRED1T_RATING en el subbloque es “EXCELLENT” y el tipo de dato es VARCHAR2. d. The value of V_CUSTOMER in the main block is “womansport” y el tipo de dato es VARCHAR2. e. El valor de V__NAME en el bloque principal es Ñ/_NAME no es visible en el bloque principal y vería un error. El valor de V„CREDIT_RATING en el bloque principal es “EXCELLENT” y el tipo de dam es VARCHAR2. Desarrollo de Aplicaciones con PUSQL Apéndice

Práctica 3"SoIucìones (continuación) 3. Cree y ejecute un bloque PLISQL que acepte dos números por medio de variables de SQL*Plus. Se debería dividir el primer número entre el segundo, y después añadir el segundo número al resultado. El resultado debería escribifse ein una variable PL/ SQL e imprimirse en la pantalla a través de una variable de SET VERIFY OFF VARIABLE Vhreßult NUMBER ACCEPT p„num1 PROMPT 'Please enter the first number: ACCEPT p„num2 PROMPT 'Please enter the second number:

Práctica 3 Soluciones (continuación) 4. Genere un bloque PL/SQL que calcule la compensación total para un año. El salario anual y el porcentaje anual de boniñcaciones se pasarán al bloque PL/SQL a través de variables de sustitución SQL*Plus y el importe do las boniñcaciones tendrá que ser convertido de un número entero a un decimal (por ejemplo, 15 a 0.15). Si el salario es nulo, asignele cero antes de calcular la compensación total. Ejecute el bloque PL/SQL. Recuerde: Utilice la función NVL para gesiìonar los valores nulos. Nota: Para comprobar el caso de la función NVL, necesitaremos escribir NULL en el prompt; ya que pulsar [Return] provoca un error. SET VERIFY OFF VARIABLE NUMBER ACCEPT pwsalary PROMPT 'Please enter the salary amount: ' ACCEPT p„_bonua PROMPT 'Please enter the bonus percentage: ' Desarrollo de Aplicaciones con PL/SQL Apéndice

Práctica 4 Soluciones l. Cree un bloque PL/SQL que seleccione el departamento con el número más alto de la tabla DEPT y lo almacene en una variable SQL*Plus. Imprima los resultados en la pantalla. Guarde su bloque PL/SQL en un archivo llamado p4q1.sql.. VARIABLE g„max*deptno NUMBER 2. Cree un bloque PUSQL que inserte un nuevo departamento en la tabla DEPT. Guarde su bloque PL/SQL en un archivo llamado p4q2.sql. a. Utilice el número del departamento recuperado del ejercicio 1 y añada 10 al número como número de departamento de entrada para el nuevo depimamemto4 b. Cree un parámetro para el nombre del departamento. c. Por el momento deje la ubicación como nula. d. Ejecute el bloque PL/SQL Desarrollo de Aplicaciones con PLISQL Apéndice E~11

Práctica 4 Soluciones (continuación) SET VERIFY OFF ACCEPT pmdeptvname PROMPT 'Introduzca el nombre del departamento: DECLARE v__deptno DEPT . DEPTNO95’1‘YPE ; BEGIN vudeptno :gwmaxwdeptno + 10; INSERT INTO dept (deptno, dname, loc) VALUES ivváeptno, '&p*dept._name’, NULL); COMMIT; END; / SET VERIFY ON d. Ejecute el bloque PL/SQL, e. Muestre el nuevo depanamemo que ha creado. 3. Cree un bloque PL/SQL que actualice la ubicación de un departamento existente. Guarde el bloque PL/SQL es un archivo llamado p4q3.sql. a. Cree un parámetro para el número del departamento. b. Cree un parámetro para la ubicación del depanamento. c. Compruebe el bloque PL/SQL. d. Muestre el número de departamento, el nombre del departamento y la ubicación del departamento actualizado. SET VERIFY OFF ACCEPT pvdeptno PROMPT ‘Introduzca el codigo de departamento: ACCEPT p_loc PROMPT ‘Introduzca la localidad del departamento: ' ‘BEGIN UPDATE dept: SET loc = WHERE deptno &p_deptn0: COMMIT; END; / SET VERIFY ON SQL> START p4q3.sq1 Desarrollo de Aplicaciones can PL/SQL Apéndice E-12

Práctica 4 Soluciones (cuntînuación) 4. Cree un bloque PIJSQL que suprima el departamento creado en el ejercicio 2. Guarde el bloque PL/SQL en un archivo llamado p4q4.sqlA a. Cree un parámetro para el número de departamento. b. Imprima en la pantalla el número de ñlas afectadas. c. Compruebe el bloque‘PL/SQL. Desarrollo de Aplicaciones con PUSQL Apéndice

Práctica 4 Soluciones (continuación) d. ¿Qué pasa si introduce un número de depaxtamemo que no existe? Si el operador introduce un número de departamento que no existe, el bloque PL/SQL se completa satisfactoriamente. porque esto no constituye una excepción. e. Confume que el departamento se ha suprimido. SQL> SELECT * 2 FROM dept; 3 WHERE deptno = Smmdeptno ; Desarrollo de Aplicaciones con PIJSQL Apéndice E-14

Práctica 5 Soluciones 1. Ejecute el script messages.sql para crear la tabla MESSAGES. Escriba un bloque PL/SQL para insertar números en la tabla MESSAGES` CREATE TABLE messages (results VARCHAR2 (60)) / a. Inserte los números 1 a 10 excepto 6 y 8. b. Haga commit antes del fînal del bloque. BEGI N FOR i IN 1..10 LOOP IF i 6 or i = 8 THEN null: ELSE INSERT INTO messages (results) VALUES (5.); END IF; COMMIT 7 END LOOP ï ENDI Í c. Haga una selección en la tabla MESSAGES para veńñcar que funcionó su bloque PL/SQL. SQL> SELECT * 2 FROM messages: Cree un bloque PL/'SQL que ei importe de comisión de un empleado, basándose en sueldo del empleado. a. Acepte el número de empleado como entrada de usuańu con un parámetro de sustitución SQL*Plus. b. Si el sueldo del empleado es inferior a 100053, establezca el impone de comisión del empleado en un 10% del sueldo. c. Sì el sueldo del empleado está entre 1000$ y 15()0$, establezca el importe de comisión del empleado en un 15% del sueldo. d Si el sueldo del empleado pasa de 150055, establezca el importe de comisión del empleado en el 20% del sueldoA e. Si el sueldo del empleado es NULL, establezca el importe de comisión del empleado en 0. f . Haga commit. Desarrollo de Aplicaciones con PUSQL Apéndice E-15

Práctica 5 Soluciones (continuación) ACCEPT pMempno PROMPT 'Please enter employee number: g. Compruebe el bloque PUSQL para cada caso utilizando los siguientes casos de prueba, y compruebe todas las comisiones actualizadas. Número de empleado Sueldo Comisión Resultante 7369 800 80 7934 130() 195 7499 1600 320 8000 NULL O Desarrollo de Aplicaciones con PUSQL Apéndice

Práctica 5 Snlucinnes (continuación) SQL> SELECT empno. Bal, comm 2 FROM emp 3 WHERE 4 ORDER BY comm; Si tiene tiempo, complete los siguientes ejercicios. 3. 4. Cree un bloque PL/SQL que recompense a un empleado añadiendo un asterisco en la columna STARS por cada 10033 del sueldo del empleado. Redondee el sueldo del empleado hasta el número entero Añada una nueva columna en la tabla EMP para almacenar asteriscos (*) sQL> ALTER TABLE emp 2 ADD stars vARCaAR2(100): más cercano. Guarde el bloque PL/SQL en un archivo llamado p5q4.sql. a, Acepte el Id del empleado como entrada del usuario con un parámetro de sustitución SQL*Plus. b. Inicíalice una variable que contenga una cadena vacia, un asterisco a la cadena por cada 100$ del sueldo. Por ejemplo, si el empleado tiene un sueldo de 80035, la cadena de asteriscos contará con ocho asteriscosA d. Actualice la columna STARS del empleado con la cadena de asteriscos e, Haga commit f. Compruebe el bloque con un empleado que no tiene sueldo y con un empleado que tiene sueldo. SET VERIFY OFF END LOOP; UPDATE emp SET stars v_asterisk WHERE empno vñempno; COMMIT; END.’ / SET VERIFY ON SQL> START SQL> SELECT empno, sal, stars 2 FROMemp 3 WHERE empno IN (7934, 8000), ACCEPT p_empno PROMPT ’Please enter the employee number: Desarrollo de Aplicaciones con PUSQL Apéndice

Práctica 6 Soluciones L Crear una nueva tabla en la que almacenar empleados y sus sueldos. SQL> CREATE TABLE top„dogs 2 (name VARCHAR2 (25) , 3 salary NUMBER(11,2)); 2. Escriba un bloque PL/SQL para recuperar el nombre y el sueldo de un empleado concreto de la tabla EMP basándose en el número del empleado. Utilice tablas PL/SQL. a. Declare dos tablas PL/SQL, ENAME_TABLE y SAL_TABLE para almacenar temporalmente los nombres y los sueldos. b. Puesto que todos los nombres y sueldos son recuperados dentro del loop, almacénelos en tablas PL/SQL. c. Fuera del loop, transfiera los nombres y sueldos de las tablas PL/SQL a la tabla TOP__DOGS. do Vacíe la tabla TOPODOGS y ejecute el ejercicio. Desarrollo de Apiicaciones con PLISQL Apéndice

Práctica 6 Soluciones (continuación) SET VERIFY OFF ACCEPT p__empno PROMPT 'Please enter the employee number: ' DECLARE TYPE ename_tab1e_type IS TABLE OF VARCHAR2(10) INDEX BY BINARYMINTEGER; TYPE sa1_tah1e„type IS TABLE OF NUMBER(7,2) INDEX BY BINARYMINTEGER; INSERT INTO top_dogs (name, salary) VALUES (ename_table (i) , ) : COMMIT: END ; / SET VERIFY ON Desarrollo de Aplicaciones con PL/SQL Apéndice E-19

Práctica 7 Soluciones 1. Prepárcse para este ejercicio vaciando la tabla TOILDOGS. 2. Cree un blnque PL/SQL que determine los empleados con sueldos más altos. a. Acepte un número n como entrada de usuario con un parámetro de sustitución SQL*Plus. b. En un bucle, obtenga los apellidos y sueldos de los n empleados con sueldos más altos de la tabla EMP. c. Almacena los nombres y suddcs en la tabla TOP,DOGS. d. Suponga que no hay dos empleados con el mismo sueldo. e, Compruebe varios casos, como un n Ü, 0 donde n es mayor que el número de empleados de la tabla EMP. ACCEPT pmnum PROMPT ’Please enter the number of top money makers: fA Vacía la tabla TOP_DOGS después de cada prueba. Desarrollo de Aplicaciones con PLISGL Apéndice

Práciica 7 Soluciones (continuación) 3. Considere el caso de que varios empleados tienen el mismo salario. Si se incluye una persona, deberá incluirse también a todas las personas con el mismo sueldo. 21. Por ejemplo, si el usuario introduce un valor de 2 para rz, aparecerían King, Ford y Scott. (Estos dos ultimos empleados tienen el segundo sueldo más alto). b. Si el usuario introduce un valor de 3, aparecerán King, Ford, Scott y Jones. Supríma todas las ñlas de TOP_DOGS y pruebe el ejercicio. CURSOR emp„cursor IS SELECT ename. sal FROM emp WHERE Bal IS NOT NULL ORDER BY Bal DESCì BEGIN Desarrollo de Aplicaciones con PL/SQL Apéndice E-21

Práctica 8 Soluciones 1. Ejecute una consulta para recuperar todos los departamemos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES, Utilice un cursor para recuperar el número de dßpanamemo y transñéralo a un cursor para recuperar los empleados de ese departamento. Desarrollo de Aplicaciones con PL/SQL Apéndice E-22

Práctica 8 Solucinnes (continuación) 2, Modiñque p5q4.sql para incorporar la funcionalidad FOR UPDATE y WHERE CURRENT OF al procesamiento de cursores, K SET VERIFY OFF ACCEPT p_empno IPROMPT 'Please enter the employee nußbe Desarrollo de Aplicaciones con PUSQL Apéndice

Práctica 9 Soluciones l. Escriba un PL/SQL para seleccionar el nombre del empleado con un valor concreto de sueldo. Le preguntaremos el sueldo al usuario a través de un parametro SQL*Plus. a. Si el sueldo introducido devuelve más de una gestione la excepción con un manejador de excepciones apropiado e inserte en la tabla MESSAGES Más de un empleado con un sueldo de . b. Si el sueldo introducido no devuelve ninguna fila, gestione la excepción con un manejador de excepciones apropiado e inserte en la tabla MESSAGES Ningún empleado con un sueldo de . C, Si el sueldo introducido solo devuelve una fila, insene en la tabla MESSAGES el nombre del empelado y el importe del sueldo. d. Gestione cualquier otra excepción con un manejador de excepciones apropiado e inserte en la tabla MESSAGES Se produjo algún otro error` e. Pruebe el bloque con varios casos SET VERIFY OFF ACCEPT p_sa1 PROMPT 'Please enter the salary value: ' WHEN noŕdataœfound THEN INSERT INTO messages (results) VALUES ('No employee with a salary of H TO„CHAR(v_sal)); WHEN too__many,_rows THEN INSERT INTO messages (results) VALUES ('More than one employee with a salary of ' H TO_CHAR(v__sa1) ) ; WHEN others THEN INSERT INTO messages (results) VALUES ('Some other error occurred. '); END: / SET VERIFY ON SQL> START p9ql.Bq1 Desarrollo de Aplicaciones con PUSQL Apéndice E-24

Práctica 9 Soluciones (continuación) 2. Modîñque p4q3.sql para añadir un manejador de excepciones. a, Escriba un manejador para que comunique un mensaje al usuario diciendo que el departamento especiñcado no existe, b. Ejecute el bloque PL/SQL introduciendo un departamento que no existe. SET VERIFY OFF Desarroilo de Apiicacîones con PUSQL Apéndice E-25

Práciica 9 Soluciones (continuación) 3. Escriba un bloque PL/SQL que imprima los nombres de los empleados que ganan 100$ más o menos del valor del salańo introducido. a. Si no hay ningún empleado dentro de ese rango de sueldo, muestre un mensaje al usuario indicando cuál es el caso Utilice una excepción para este caso. b. Si hay uno o más empleados dentro de ese rango, el mensaje debería indicar cuántos empleados hay en ese rango de sueldo. c. Gestione cualquier otra excepción con un manejador de excepciones apropiado, el mensaje debería indicar que se ha producido otro error. SET VERIFY OFF ACCEPT p„sal PROMPT ‘Please enter the salary: ' Desarrollo de Aplicaciones con PUSQL Apéndice E-26

Práctica 10: Soluciones 1. Crear y llamar al procedimiento ADD__PROD y analizar los resultados: 3. b. Crear un procedimiento llamado ADD_PROD para insertar un nuevo producto en la tabla PRODUCT. CREATE OR REPLACE PROCEDURE add Mprod 1N v_descrip IN product.descrip"/„TYPE) IS BEGIN INSERT INTO product (prodid, descrip) VALUES (v_prodid, v__deBcrip); COMMIT; END add _prod; / Compile el código, llame al procedimiento, y a continuación, consulte la tabla PRODUCT para ver los resultados: Procedure created. SQL> EXECUTE add__prod (9999, PL/SQL procedure successfully completed. ’SP TENNIS BALLS') Llame de nuevo al procedimiento, pasando un valor para “prodid” de 100860. ¿Sabría dar una explicación sobre qué pasa y por qué? SQL> EXECUTE add__prOd (100860, begin add¿prod(l00860, 'SP ADULT TENNIS RACKET') ERROR at line 1 Hay una restricción de integridad de clave primaria sobre la columna prodíd. Desarrollo de Aplicaciones con PUSQL Apéndice E-27

Práctica 10: Soluciones (continuación) 2. Cree un procedimiento llamado UPDMPROD para modificar un producto dc la tabla PRODUCT , a. Crcc un procedimiento llamado UPD__PROD para modificar la descripción del producto. Incluya el control de excepciones necesario: IS BEGIN UPDATE product SET descrip v_descrip IF SQL°/QNOTFOUND THEN RAISEHAPPLICATION_ERROR(-20202, 'N0 products updated. ) ; END IF.' END updjrodi / b. Compile el código, llame al procedimiento, y a continuación consulte la tabla PRODUCT para verlos resultados. También chequeo el control de excepciones, intentando modificar un producto que no existe. Procedure created. SQL) EXECUTE upd_pr0d (9999, 'SP TENNIS NETS') PL/SQL procedure successfully completed. Desarrollo de Aplicaciones con PLISQL Apéndice

Práctica 1D: Soluciones (continuación) 3. Cree un procedimiento llamado DEL„PROD para borrar un producto de la tabla PRODUCT. a. Cree un procedimiento llamado DEL*PROD para borrar un producto de la tabla PRODUCT. Incluya el control de excepciones necesario: CREATE OR REPLACE PROCEDURE de1__prod (vwprcdid IN product.prodid%TYPE) IS BEGIN DELETE FROM product WHERE prodìd IF SQUBSNOTFOUND THEN RAISE„APPLICATION_ERROR(-20203, ‘No products deleted. ) ; END IF; END DELMPROD; / b. Compile el código, llame al procedimiento, y a continuación consulte la tabla PRODUCT para ver los resultados. También chequee el control de excepciones, intentando borrar un producto que no existe. Procedure created. SQL> EXECUTE de1_prod (9999) PL/SQL successfully completed, Desarrollo de Aplicaciones con PL/SQL Apéndice E-29

Práctica 10: Soluciones (continuación) 4. Cree un procedimiento para consultar la tabla EMP que recupere el salario y oficio del empleado 7839. a. Cree un procedimiento que devuleva el SALARIO y OFICIO del empleado especiñcado. (Use EMP„NO). b. Compile el código, llame al procedimiento y vìsuaüce el salario y oficio para el empleado número Procedure created. SQL> VARIABLE g_Ba1 NUMBER SQL> VARIABLE Ob VARCHAR2 (15) SQL> EXECUTE query~emp (7839, :g_job) PL/SQL procedure successfully Completed. Desarrollo de Aplicaciones can PLISQL Apéndice E-30

Práctica 10: Soluciones (continuación) SQL> PRINT gujob GMJOB PRESIDENT c. Llame otra vez al procedimiento, pasando el número de empleado 9898. ¿Qué ocurre? ¿Por qué? ERROR at line 1: ORA~0l403: no data found ORAv06512: at ”SCOTT.QUERY__EMP", line 7 ORA-O6512: at line 1 No hay ningún empleado enla tabla EMP que se corresponda con el número 9898. La sentencia SELECT no recupera datos de la B.D, resdltando un error “fatal” de PL/SQL: NO„DATA„FOUND. Desarrollo de Aplicaciones con PUSQL Apéndice E-31

Práctica 11: Soluciones 1. Cree y llame a la función que devuelva la descripción de un producto. a. Cree una función llamada Q_PROD que devuelva la descripción de un producto, a una variable host: CREATE OR REPLACE FUNCTION CLpr0d (v„prodid IN product.prodid°/JTYPE) RETURN VARCHAR2 IS v~deecrip product . descrip%TYPE; BEGIN SELECT descrip INTO v_descrip FROM product WHERE prodid = v__prodid; RETURN (vñdescrip) ; END q_prodi / b. Compile the código, llame a la función, y a continuación csnsuke la variable host para ver el resultado: Funct ion Created _ SQL> VARIABLE g__descrip VARCHAR2(30) SQL> EXECUTE :g„descrip ¢Lprod (101863) PL/SQL procedure successfully Completed. SQL> PRINT gwdescrip G„DESCRIP SP JUNIOR RACKET Desarroilo de Aplicaciones con PLISQL Apéndice E-32

Práctica 11: Snluciones (continuación) 2. Crear una función almacenada ANNUALHCOMP para devolver el salario anual cuando se pasa el salario mensual y la comisión de un empleado, Asegurarse de que la función controla valores NULL. a. Crear y llamar ala función ANNUAL_COMP, pasando los valores del salario mensual y de la comisión. La función debería devolver el salario anual, deñnido CREATE OR REPLACE FUNCTION annua1„comp (vwsal IN emp.sal%TYPE, vacomm IN emp.comm" SELECT empno, ename, 2 annua1_ccmp(sa1, comm) "Annual Compensation" 3 FROM emp; EMPNO ENAME Annual Compensation 7839 KING 60000 7698 BLAKE 34200 7782 CLARK 29400 '7566 JONES 35700 14 rows selected. Desarrollo de Aplicaciones con PL/SQL Apéndice E-33

Práctica 11: Soluciones (continuación) 3. Crear un procedimiento, NEW_EMP, para insertar un empleado nuevo dentro dela tabla EMP. El procedimiento debería contener una llamada a la función VALID„DEPTN() para comprobar si existe en la xabla el departamento especíñcado para el nuevo empleado. a. Crear una función VALID,DEPTNO para validar un número de departamento especìñcado. La función debería devolver un BOOLEAN. CREATE OR REPLACE FUNCTION va1id_deptno (v__deptno IN dept.deptno%'I‘YPE) RETURN BOOLEAN IS vwduxnmy VARCHAR2(1); BEGIN SELECT 'X' INTO v_dummy FROM dept WHERE deptno = v_dept:no; RETURN (TRUE) ; EXCEPTION WHEN No„DATA„FOUND THEN RETURN (FALSE); END va1id_âeptno; / Desarrollo de Aplicaciones con PLISQL Apéndice

Práctica 11: Soluciones (continuación) b. Crear el procedimiento NEW„EMP para añadir un empleado a la tabla EMP, Debería añadirse un nuevo registro a EMP si la función devuelve TRUE. Sila función devuelve FALSE, el proœdimiento debería alertar al usuario con un mensaje apropiado Deñnir valores DEFAULT para la mayoría de argumentos. La comisión por defecto es 0, el salario por defecto es 1000, el número de departamento por defecto es 30, el puesto por defecto es SALESMAN y el número de gestor por defecto es 7839. c. Comprobar el procedimiento NEW_EMP añadiendo un nuevo nombre de empleado al departamento 99 (HARRIS). Dejar el resto delos parámetros con sus valores por defecto, ¿Cual es el resultado?. SQL> execute newwemp(v_ename => ‘HARRIS',v_deptno => 99) Invalid department number. Try again. PL/SQL procedure successfully completed. d. Comprobar el procedimiento NEW_EMP añadiendo un nuevo nombre de empleado al departamento 30 (HARRIS). Dejar el resto de los parámetros con sus valores por defecto, ¿Cual es el resultado?. PL/ SQL procedure successfully Completed . Desarrollo de Aplicaciones can PUSQL Apéndice E-35

Práctica 12: Soluciones 1. Cree la especiñcación y cuerpo de un paquete llamado PROD_PACK que contenga los procedimientos ADDMPRÚD, UPD_PROD y DELMPROD y la función Q_PROD. a. Hacer todos los programas públicos. Nota: Considere si sigue necesitando los procedimientos y la función, que acaba de “empaquetar”, como objetos independientes. CREATE OR REPLACE PACKAGE pr0d__pack IS PRQCEDURE addmprod (vvprodid IN product.prodid%'I‘YPE, vwdescrip IN product.deacrip°/UTYPE) PROCEDURE upd _prod (v_prodid IN product.prodid%TYPE, v_descríp IN product.descrip"/QTYPE) ; PROCEDURE del „prod (v_prodid IN product.prodid°/°'1‘YPE); RETURN VARCHAR2; END prod Jack; / Desarrolio de Aplicacinnes con PLISQL Apéndice

Práctica 12: Soluciones (continuación) CREATE OR REPLACE PACKAGE BODY prod___pack IS PROCEDURE add „prod (v__prodíd IN product.prodìd%TYPE, v__descrìp IN product.descrìp%TYPE) IS BEGIN INSERT IMQ product (prodid, descrip) VALUES (vwprodid, v_descrip); END add Jarod; PROCEDURE upd _prod (vwprodíd IN prcduct.prodìd%TYPE, v_descrip IN product.descrìp%TYPE) IS BEGIN UPDATE product SET descrip vwdescríp RAISE_APPLICATION„_ERROR ( 02 02 , No products updated. ) ; PROCEDURE del _prod (vńprodid IN product.prodìd°/JPYPE) IS BEGIN DELETE FROM product WHERE prodid = RAISEMAPPLICATION_ERR0R (-20203, 'No products deleted. ) ; Desarrollo de Aplicaciones con PUSQL Apéndice

Práctica 12: Soluciones (continuación) FUNCTION q_prod (v_prodíd IN product.prodid%TYPE) RETURN VARCHAR2 IS vmdescrip product; . descrip°/QTYPE; BEGIN SELECT descrip scrip FROM product b. Llame al procedinúcnto DEL_PROD: SQL> execute prodMpack.del„prod(100860) PL/SQL procedure successfully completed. C. Consulte la tabla PRODUCT para ver el resultado. SQL> SELECT * from product 2 WHERE prodid -_- 100860: no rows selected Desarrollo de Aplicaciones con PL/SQL Apéndice E-38

Práctica 12: Soluciones (conlínuación) 2. Cree y llame a un paquete que contenga construcciones públicas y privadas. a. Cree la especifìcación y el cuerpo de un paquete llamado EMP~PACK que contenga el procedimiento NEWHEMP como construcción pública y la función VALID„DEPTNO, como construcción privada. CREATE OR REPLACE PACKAGE emp__pack IS PROCEDURE newnemp DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT Desarrollo de Aplicaciones con PL/SQL Apéndice

Práctica 13: Soluciones (continuación) CREATE OR REPLACE PACKAGE BODY empjack IS FUNCTION validmdeptno (v__deptno IN dept.deptno%TYPE) RETURN BOOLEAN Desarrollo de Aplicaaiones con PLISQL Apéndice

Práctica 12: Soluciones (continuación) b. Llame al procedimiento NEW_EMP utilizando el valor 99 como n° de departamento: Invalid department number try again. c. Llame al procedimiento NEW_EMP utilizando el valor 30 como 11° de departamento: PL/SQL procedure successfully completed. 3. Crear un paquete llamado CHK__PACK que contenga los procedimientos CHKJIIREDATE y CHK_DEPT„MGR, Hacerlos como programas públicos. a. El procedimiento CHK__HIREDATE comprueba si la fecha de contratación de un empleado está dentro del siguiente rango: [sysdatc - 50 years, sysdatc + 3 months] Notas: ° Sila fecha es invalida, aparecería un mensaje de error en la aplicación indicando por que no se acepta la fecha. Asegurese que se ignora el componente del tiempo en el valor de la fecha. Utilizar una constante para referirse al límite de 5() años. Si el valor de la fecha de contrato es un valor nulo, sería considerada como una fecha de contrato inválida. b. El procedimiento CHK_DEPT_MGR comprueba la combinación del departamento y dei director para un empleado dado. Esto significa que ei número de director facilitado debe ser igual ai número de director que supervisa el departamento del empleado. Notas: Si la combinación número/director del departamento es inválida, aparecería un mensaje de error en la aplicación. Asegurese de controlar el caso en el que no hay director para el departamento. Desarrollo de Aplicaciones can PUSQL Apéndice E-41

Práctica 12: Saluciones (continuación) CREATE OR REPLACE PACKAGE BODY chk__pack IS PROCEDURE chk„hiredate(v„date in emp.hiredate°/ctype) OR v~date IS NULL THEN RAISE__APPLICATION_ERROR ( 2 02 00 , Not a valid hiredate'); RAISE_APPLICA'1‘ION_ERROR(-20201. ‘Not the mgr for this department ) ; WHEN OTHERS THEN RAISE__APPLICATION_ERROR ( -2 02 02 , Other error occurred' ) ; END chk_dept_mgr.' END chkmpack; / Desarrollo de Aplicaciones can FLISOL Apéndice

Práctica 12: Soluciones (continuación) c. Pruebe el procedimiento CHK_HIREDA'I'E mediante el comando siguiente: d. Pruebe el procedimiento CHK__HIREDA'I`E mediante el comando siguiente:

ERROR at line 1: ORA“20200: Not a valid hiredate ORA-06512: at "SCOTT CHKMPACK" , line 9 ORA~065l2: at line 1 e. Pruebe el procedimiento CHKJIIREDATE mediante el comando siguiente: SQL> execute chk„pack.chk„hiredate('01-JAN-98') PL/SQL procedure successfully completed. Desarrollo de Aplicaciones con PLISQL Apéndice

Práctica 13: Solucianes 1. Cree un nuevo paquete que implemente una regla de negocio. a. Cree un procedimiento llamado CHK_DEPT_JOB para veriñcar si determinada combinación de número de depto. y trabajo es válida. En este caso, “válida” signiñca que tiene que ser una combinación que actualmente exista en la tabla EMP. Notas: ° Use una tabla PL/SQL para almacenar las combinaciones válidas de dpto. y oñcio. La tabla PUSQL necesita ser rellcnada sólo una vez. ' Si la combinación no es válida, emitir un mensaje de error en la aplicación. Desarrollo de Aplicaciones con PUSQL Apéndice E-44

Práctica 13: Soluciones (continuación) CREATE OR REPLACE PACKAGE BODY Chk__paCk2 IS í number TYPE emp_tab1e_type IS TABLE OF VARCHAR2(50) INDEX BY BINARYMINTEGER; ob emp_tab1e„type ; CURSOR emp_cur IS SELECT deptno,job FROM emp; RAISE_APPLICATION„_ERROR(-20500, 'Not a valid job for this dept'); Desarrollo de Aplicaciones con PLISQL Apéndice E-45

Práctica 13: Soluciones (continuación) b. Pruebe el procedimiento empaquetado CHK_DEP1`_JOB mediante el comando siguiente: C. Pruebe el procedimiento empaquetado CHK_DEPT„JOB mediante el comando siguiente: Desarrollo de Aplicaciones con PL/SQL Apéndice

Práctica 13: Soluciones (continuación) 2. Cree dos funciones, con el mismo nombre PRINTÑIT, para imprimir una fecha 0 un número, dependiendo del método de llamar ala función. Notas: ° Para imprimir el valor de fecha, utilizar como formato de entrada y como formato de salida “FmMonth/dd/yyyy". Asegurarse de que se manejan entradas inváljdas. ~ Para imprimir el número, utilizar como formato de salida “999,999.0U”. CREATE OR REPLACE PACKAGE over_1oad is FUNCTION prínt__ít (v_arg date) RETURN VARCHAR2ì FUNCTION print__it(v__arg VARCHAR2) RETURN NUMBER; END over__1cad; / CREATE OR REPLACE PACKAGE BODY Cveruload is FUNCTION print„_it(v__arg date) RETURN VARCHAR2 IS BEGIN RETURN to_char(v_„arg, 'FmMonth, dd/yyyy' ) ; END FUNCTION printmit (vmarg VARCHAR2) RETURN NUMBER ' Is BEGIN RETURN tounumbex (v__arg, 999, 999 . 00 ) ; END END overwloadf / Desarrollo de Aplicaciones con PLISQL Apéndice E-47

Práctica 13: Soluciones (continuación) a. Pruebe la primera versión de PRINT__IT mediante el comando siguiente: SQL> variable todays„date varchar2(20) PL/SQL procedure successfully Completed. SQL> print todays„_date TODAYSÚDATE January, 29/1998 b. Pruebe la segunda versión de PRINTJT mediante el comando siguiente: Desarrollo de Aplicaciones con PLISQL Apéndice E-48

Práctica 14: Soluciones 1. Las operaciones DML sobre tablas solamente se permitirán en horas de trabajo, es decir, entre las 8:45 dela mañana y las 5:50 de la tarde; de lunes a viernes. a. Cree un procedimiento almacenado llamado SECURE_DML que muestre un mensaje de error, en caso de no cumplir la regîa especìñcada anteriormente, como “Sólo puede modiñcar datos durante las horas oñciales de trabajo”. CREATE QB. REPLACE PROCEDURE SeCure_„dm1 IS BEGIN IF TOWCHAR (SYSDATE, ‘HH24:MI') NOT BETWEEN '08:45' AND '17:30' OR T0__CHAR (SYSDATE, IN ('SAT‘ , 'SUN') THEN RAISE__APPLICATION_ERROR (-20205, 'You may only make changes during normal office hours' ); END IF? END secureùdml; / 2. Crear un nigger en la tabla PRODUCT que llame al procedimiento de arriba. CREATE OR REPLACE TRIGGER securenprod BEFORE INSERT OR UPDATE OR DELETE ON product BEGIN Becurendmlf END secure__prod; a. Pruebe el procedìrniento, modiñcando la franja horaria propuesta en el proœdimiento inicial, e intentando insertar un nuevo registro en la tabla PRODUCT. Después de la comprobación, restablezca la franja horaria a sus valores originales (paso 1). SQL> insert into product 2 values (99999, 'My Product' )7 insert into product * ERROR at line 1: ORA-20205: You may only make Changes during normal office hours. ORA-06512: at "SCOTT.SECURE__DML", line 6 ORA~065l2: at "SCOTT.SECURE~PROD", line 2 ORA~O4088: error during execution of trigger 'SCOTT.SECURE„PROD' Desarrollo de Aplicaciones con PUSQL Apéndice E-49

Práctica 14: Soluciones (continuación) 3. La comisión de un vendedor cambiaría con cualquier pedido nuevo 0 por cambios en los pedidos existentes. Su comisión se almacena en la columna COMM de la tabla EMP. En la tabla CUSTOMER se asigna un vendedor a un cliente en particular. a. Crear un procedimiento que actualizará la comisión de un vendedor. Utilizaremos parámetros para enviar el identificador del cliente, el total antiguo del pedido y el total nuevo del pedido, desde el trigger que hace la llamada. El procedimiento necesitará localizar el número del empleado en la tabla CUSTOMER y actualizar el registro del vendedor en la tabla EMP, añadiendo una nueva comisión al valor existente. Para este ejercicio pondremos una porcentaje de comisión del 5%. CREATE OR REPLACE PROCEDURE ‘update_cOmm IN NUMBER, IN NUMBER, v_new_tot IN NUMBER) IS v__repid NUMBER ; omm NUMBER; BEGIN SELECT repid INTO v_:cepid FROM customer WHERE custid = vwcustid; b. Crear un nigger en la tabla ORD el cual llamará al procedimiento, pasando los parámetros necesarios. CREATE OR REFLACE TRIGGER update„emp„comm AFTER INSERT OR UPDATE OR DELETE ON Ord FOR EACH ROW BEGIN update_comm (:new.custid, :o1d.tota1, :new.total); END: / Desarrollo de Aplicaciones con PLJSQL Apéndice E-50

Práctica 14: Soluciones (continuación) c. Modiñcar el pedido 601, para asignarle un total de Veriñcar queI la comisión de WARD se ha incrementado en 0.03. La comisión original cra 500. SQL> UPDATE Ord SET total 3 WHERE ordid = 601; SQL> SELECT ename, comm FROM emp WHERE ename = 'WARD' ENAME COMM WARD 500 _ 03 4. A las tablas EMP y DEPT se les aplica una serie de reglas de negocio, 2. Decidir cómo implementar cada regla: por medio de constraints o triggers. ¿Qué restricciones o triggers se necesitan y qué problemas podemos esperar?. b. Implemente las reglas de negocio mediante triggers. Reglas de Negocîo 1. Los vendedores siempre deberían recibir una comisión. Los empleados que no son vendedores nunca deberían recibir una comisión. Implemente la regla 1 con una conslïaint. ALTER TABLE emp ADD CONSTRAINT emp_comm_chk CHECK ((job = 'SALESMAN‘ and comm IS NOT NULL) OR (jab 'SALESMAN' and Comm IS NULL)): Desarrollo de Aniîcaciones con PLISQL Apéndice

Práctica 14: Soluciones (continuación) 2. La rabia EMP debería contener exactamente un PRESIDENT. Comprobar nuestra respuesta. CREATE OR REPLACE TRIGGER presidente BEFORE DELETE OR INSERT OR UPDATE OF job ON emp FOR EACH ROW DECLARE num _presi NUMBER; BEGÍÑ IF DELETING AND :OLD.JOB = 'PRESIDENT' THEN RAISE„_APPLICATION„ERROR (-20001, 'No podemos borrar al PRESIDENT' ) ; END IF; IF UPDATING THEN IF :OLD.JOB = 'PRESIDENT' THEN IF :NEW.JOB 'PRESIDENT' THEN RAISE„„APPLICA'I‘ION__ERROR (-20002 , El PRESIDENT no puede dejar de serlo' ) ; END IF; ELSE IF :NEW.JOB = 'PRESIDENT' THEN RAISE„APPLICATION_ERROR (-20003, Ya tenemos un PRESIDENT' ) ; END IF; END IF; END IF; IF INSERTING AND :NEW.JOB = ‘PRESIDENT’ THEN RAISE_APPLICATION__ERROR (-20003 , 'Ya tenemos un PRESIDENT' ) ï SQL> insert into emp (empno, ename, job. deptno) 2 values (7800, ‘HARRIS‘, 'PRESIDENT',20); insert; into emp (empno, ename, job, deptno) ERROR at line 1: ORA«20003: Ya tenemos un President ORA"06512: at "SCOTT.PRESIDENTE", line 2 ORA~O4088: error during execution of trigger 'SCOTT.PRESIDENTE' Desarrollo de Aplicaciones con PLJSQL Apéndice

Práctica 14: Soluciones (continuación) 3. Los salarios solo podrían aumentarse, no disminuirse. Comprobar nuestra respuesta. CREATE OR REPLACE TRIGGER check*sa1 BEFORE UPDATE OF sal ON emp FOR EACH ROW WHEN (new.sa1 o1d.sa1) BEGIN RAISE„APPLICA'1’IONmERROR(-20002 , Salary may not be reduced ' ) , END check_sal; / SQL> update emp 2 set sal 1160 3 where empno = 7934; update emp * ERROR at line 1: ORA~20002: Salary may not be reduced ORA-06512: at "SCO'I‘T.CHECK„_SAL", line 2 ORA-O4088: error during execution of trigger 'SCOTT.CHECK_SAL‘ Desarrollo de Aplicaciones con PUSQL Apéndice

Práctica 14: Soluciones (continuación) 4. Si un dcpartamento se traslada a otra parte, cada empleado de ese departamento tendrá automáticamente un incremento de salado del 2%. CREATE OR REPLACE TRIGGER change_1ocation AFTER UPDATE OF loc ON dept FOR EACH ROW WHEN (0LD.loc NEW.loc) BEGIN SET sal sa1*1.02 WHERE deptno = :NEw.deptno; END changewlocation; / SQL> select ename, sal, deptno 2 from emp 3 where deptno = 30, ENAME SAL DEPTNO BLAKE 2 8 5 O 3 0 NARTIN 12 5 O 3 O ALLEN 1 6 0 O 3 O SQL> update dept; 2 Set loc = 'HOUSTON' 3 where deptno = 30; SQL> select ename, sal, deptno 2 from emp 3 where deptno = 30; ENAME SAL DEPTNO BLAKE 2 9 O7 3 O MARTIN 1 2 7 5 3 0 ALLEN 1 6 3 2 3 0 Desarrollo de Aplicaciones con PUSQL Apéndice E-54

Práctica 15: Soluciones 1. Contesta a las siguientes preguntas: a. ¿Pueden una tabla o un sinónimo ser inválidos? Una tabla 0 sinónimo nunca puede ser ìnvalidado, sin embargo si pueden serlo los objetos dependientes. b. Imagine la siguiente situación: El procedimiento “standalone” MY__PROC depende del procedimiento empaquetado MY„PROC_PACK. ' La definición del procedimiento MY„PROC_PACK se cambia mediante recompilación del cuerpo del paquete. La especificación del procedimiento MY__PROC_PACK no se altera en la del paquete. ' ¿Se invalida el procedimiento standalone MY„PROC? Aunque el cuerpo del paquete sea reeompilado, el procedimiento “standalone” MY_PROC que depende del procedimiento empaquetado MY__PROC„PACK, no resultará “no válido”, porque la especificación del paquete no ha cambiado. 2. Supongamos que hemos perdido el código del procedimiento NEW_EMP y de la función VALÍDWDEPTNO que creamos en la lección 11. Para regenerar el código, crear un fichero “spool” paraconsultar la vista apropiada del Diccionario de Datos. SET ECHO OFF HEADING OFF FEEDBACK OFF VERIFY OFF COL DUMMY NOPRINT COL LINE NOPRINT SET PÃGESIZE 0 SPOOL RECREATE . SQL SELECT text , line FROM USERWSOURCE WHERE name = ’&the_object’ UNION SELECT 'CREATE OR REPLACE ',1 dummy FROM DUAL ORDER BY line / SELEC1` / ' FROM DUAL / SPOOL OFF SET PAGESIZE 24 SET FEEDBACK ON VERÍIFY ON HEADING ON ECHO ON Desarrollo de Aplicaciones con PLJSQL Apéndice E-55

Práctica 15: Solucinnes (continuación) 3. Ejecute el script utldlreexsql. Dibuja una jerarquía que mucsire todas las dependencias involucrando al procedimiento NEWHEMP y a la función VALlD„DEP’I`NO. Consulte la vista “ideptree” para ver los resultados. SQL> exec deptree_fi11( PROCEDURE’ , 'SCOTT' . 'NEW_EMP' ) PL/SQL procedure successfully completed. SQL> select * from ideptree; DEPENDENC IES PROCEDURE SCOTT . NEWMEMP SQL> exec deptree„fi1l( ‘FUNCTION‘ , 'SCOTT' , ‘VALID„DEP'I‘NO' ) PL/SQL procedure successfully completed. SQL> select * from ideptree; DEPENDENCIES FUNCTION SCOTT . VALIDMDE PTNO PROCEDURE SCOTT . NEW EMP Ejercicio Opcional: 4. Validar los objetos inválidos de forma dinámica. a. Haga una copia de la tabla EMP, llamada EMP_COP. CREATE TABLE empgcop AS SELECT * FROM emp; b. Modíñcar la tabla EMP y añadir la columna TOTSAL(NUMBER(9,’2)). ALTER TABLE emp ADD (totaal NUMBER(9,2) ); c. Crear un üchern script para imprimir el nombre, tipo y status delos objetos invalides. SELECT ob3'ect_name, object_type, status FROM user„objects WHERE Status ‘INVALID’ / Desarrollo de Aplicaciones con PL/SQL Apéndice

Práctica 15: Soluciones (continuación) d. Crear un procedimiento llamado C()MPILE_OBJ que recompile todos los objetos inválidos en nuesüo esquema. Haga uso del procedimiento ALTER„_COMPILE dei paquete DBMSwDDL. CREATE OR REPLACE PROCEDURE compí1e_obj IS CURSOR obj__cur IS SELECT obj ectjzype! obj ect_name FROM user„obj eats WHERE status ' INVALID ' AND obj ectgtype IN ( PROCEDURE , FUNCTION , PACKAGE , e. Ejecute el script anterior y chequcc el estado del valor de la columna. Desarrollo de Aplicaciones con PUSQL Apéndîce E-57

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF