soluciones ejercicios pl/sql

59

description

soluciones ejercicios pl/sql pasadas a un ocr

Transcript of soluciones ejercicios pl/sql

Page 1: soluciones ejercicios pl/sql
Page 2: soluciones ejercicios pl/sql

Soluciones de las

Prácticas

Page 3: soluciones ejercicios pl/sql

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

Page 4: soluciones ejercicios pl/sql

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

Page 5: soluciones ejercicios pl/sql

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

Page 6: soluciones ejercicios pl/sql

Práctica 3 Soluciones

PLISQL Block

Desarrollo de Aplìcacinnes con PLISQL Apéndice

Page 7: soluciones ejercicios pl/sql

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

Page 8: soluciones ejercicios pl/sql

Práctica 3 Soluciones (continuación)

Ejemplo de ámbito

DECLARE

v_customer

Womansport ;

EXCELLENT

Desarrollo de Aplicaciones con PL/SQL Apéndice

Page 9: soluciones ejercicios pl/sql

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

Page 10: soluciones ejercicios pl/sql

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:

Page 11: soluciones ejercicios pl/sql

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

Page 12: soluciones ejercicios pl/sql

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

Page 13: soluciones ejercicios pl/sql

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

Page 14: soluciones ejercicios pl/sql

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

Page 15: soluciones ejercicios pl/sql

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

Page 16: soluciones ejercicios pl/sql

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

Page 17: soluciones ejercicios pl/sql

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

Page 18: soluciones ejercicios pl/sql

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

Page 19: soluciones ejercicios pl/sql

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

Page 20: soluciones ejercicios pl/sql

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

Page 21: soluciones ejercicios pl/sql

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

Page 22: soluciones ejercicios pl/sql

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

Page 23: soluciones ejercicios pl/sql

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

Page 24: soluciones ejercicios pl/sql

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

Page 25: soluciones ejercicios pl/sql

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 <.sueldo>.

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 <sueld0>.

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

Page 26: soluciones ejercicios pl/sql

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

Page 27: soluciones ejercicios pl/sql
Page 28: soluciones ejercicios pl/sql

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

Page 29: soluciones ejercicios pl/sql

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

Page 30: soluciones ejercicios pl/sql

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

Page 31: soluciones ejercicios pl/sql

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

Page 32: soluciones ejercicios pl/sql

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

Page 33: soluciones ejercicios pl/sql

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

Page 34: soluciones ejercicios pl/sql

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

Page 35: soluciones ejercicios pl/sql

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"<=TYPE)

RETURN NUMBER

IS

BEGIN

RETURN (NVL(v*sa1,0) * 12 + NVL(v„„comm,0));

END annualwcompp

/

b. Utilice la función almacenada en una sentencia SELECT contra la tabla EMP.

SQL> 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

Page 36: soluciones ejercicios pl/sql

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

Page 37: soluciones ejercicios pl/sql

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

Page 38: soluciones ejercicios pl/sql

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

Page 39: soluciones ejercicios pl/sql

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

Page 40: soluciones ejercicios pl/sql

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

Page 41: soluciones ejercicios pl/sql

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

Page 42: soluciones ejercicios pl/sql

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

Page 43: soluciones ejercicios pl/sql

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

Page 44: soluciones ejercicios pl/sql

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

Page 45: soluciones ejercicios pl/sql

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

Page 46: soluciones ejercicios pl/sql

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

Page 47: soluciones ejercicios pl/sql

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

Page 48: soluciones ejercicios pl/sql

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

Page 49: soluciones ejercicios pl/sql

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

Page 50: soluciones ejercicios pl/sql

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

Page 51: soluciones ejercicios pl/sql

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

Page 52: soluciones ejercicios pl/sql

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)

I S

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

Page 53: soluciones ejercicios pl/sql

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

Page 54: soluciones ejercicios pl/sql

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

Page 55: soluciones ejercicios pl/sql

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

Page 56: soluciones ejercicios pl/sql

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

Page 57: soluciones ejercicios pl/sql

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

Page 58: soluciones ejercicios pl/sql

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

Page 59: soluciones ejercicios pl/sql

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