Sie sind auf Seite 1von 7

Introduction to Oracle: SQL and PL/SQL, Instructor Guide, Volumen 1

Práctica 19: Escribiendo Estructuras de Control


--------------------------------------------------------------------

Ejercicio 1:
Ejecute el archivo de comandos (Script) lab19_1.sql para crear la tabla
MESSAGES. Escriba un bloque PL/SQL para insertar números dentro
de la tabla MESSAGES.
a) Inserte los números desde 1 hasta 10, excluyendo a los números 6
y 8
b) Confirme y Haga permanente los cambios (COMMIT) antes de fina
lizar el bloque PL/SQL
c) Seleccione desde la tabla MESSAGES para verificar que el bloq
ue PL/SQL ha funcionado.
RESULTS
-------
1
2
3
4
5
7
9
10
Respuestas 1.a) y 1.b)
----------------------
SQL> edit lab19_1.sql
Contenido del archivo de comandos: lab19_1.sql
---------------------------------------------
"
CREATE TABLE MESSAGES (
RESULTS NUMBER(3)
);
"
SQL> start lab19_1.sql
SQL> edit p19q1.sql
Contenido del archivo de comandos con el bloque PL/SQL: p19q1.sq
l
----------------------------------------------------------------
-
"
DECLARE
v_min NUMBER(2) := 1;
v_max NUMBER(2) := 10;
BEGIN
FOR i in v_min..v_max LOOP
IF (i <> 6 AND i <> 8) THEN
INSERT INTO MESSAGES
VALUES ( i );
END IF;
END LOOP;
COMMIT;
END;
/
"
SQL> start p19q1.sql
Respuesta 1.c)
--------------
SQL> SELECT RESULTS
FROM MESSAGES;
Ejercicio 2: Cree un bloque PL/SQL que compute el monto de comisión para un emp
leado dado basándose en el salario del empleado.
a) Ejecute el archivo de comandos lab19_2.sql para insertar un n
uevo empleado dentro de la tabla EMP.
Nota: EL empleado tendrá salario NULL, número 8000 y nombre DOE.
b) Acepte el número de empleado como entrada del usuario con una v
ariable de sustitución de SQL*PLUS.
c) Si el salario del empleado es menor que $1.000, ponga el mont
o de comisión para el empleado a un 10% del salario
d) Si el salario del empleado está entre $1.000 y $1.500, ponga el
monto de comisión para el empleado a un 15% del salario
e) Si el salario del empleado es excede $1.500, ponga el monto d
e comisión para el empleado a un 20% del salario
f) Si el salario del empleado es NULL, ponga el monto de comisión
para el empleado a 0.
g) Confirme todos los cambios con un COMMIT.
h) Testee el Bloque PL/SQL para cada caso usando la tabla de cas
os de prueba siguiente, y chequee cada comisión actualizada.
Número de Empleado Salario Comisión Resultant
e
------------------ ------- ----------------
---
7863 800 80
7834 1300 195
7844 1500 300
8000 NULL 0
Chequeo:
--------
EMPNO ENAME SAL COMM
----- ----- --- ----
7863 SMITH 800 80
7834 MILLER 1300 195
7844 TURNER 1500 300
8000 DOE NULL 0
Respuesta 2.a)
--------------
SQL> edit lab19_2.sql
Contenido del archivo de comandos: lab19_2.sql
----------------------------------------------
"
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COM
M, DEPTNO )
VALUES (
8000,
'DOE',
'CLERK',
NULL,
SYSDATE,
NULL,
NULL,
10
);
"
SQL> start lab19_2.sql
Respuestas 2.b), 2.c), 2.d), 2.e), 2.f) y 2.g)
----------------------------------------------
SQL> edit p19q2.sql
Contenido del archivo de comandos con el Bloque PL/SQL: p19q2.sq
l
----------------------------------------------------------------
-
"
ACCEPT p_emp_empno PROMPT 'Por favor ingrese el número de emp
leado: ';
DECLARE
v_emp_empno EMP.EMPNO%TYPE;
v_emp_sal EMP.SAL%TYPE;
BEGIN
v_emp_empno := &p_emp_empno;
SELECT SAL
INTO v_emp_sal
FROM EMP
WHERE EMPNO = v_emp_empno;
IF v_emp_sal < 1000 THEN
UPDATE EMP
SET COMM = v_emp_sal * 0.10
WHERE EMPNO = v_emp_empno;
ELSIF ( v_emp_sal >= 1000 AND v_emp_sal <= 1500 ) THEN
UPDATE EMP
SET COMM = v_emp_sal * 0.15
WHERE EMPNO = v_emp_empno;
ELSIF v_emp_sal > 1500 THEN
UPDATE EMP
SET COMM = v_emp_sal * 0.20
WHERE EMPNO = v_emp_empno;
ELSIF v_emp_sal = NULL THEN
UPDATE EMP
SET COMM = 0
WHERE EMPNO = v_emp_empno;
END IF;
COMMIT;
END;
/
"
Respuesta 2.h)
--------------
SQL> start p19q2.sql
Con el número de empleado: 7863
SQL> start p19q2.sql
Con el número de empleado: 7834
SQL> start p19q2.sql
Con el número de empleado: 7844
SQL> start p19q2.sql
Con el número de empleado: 8000
Chequeo:
SQL> SELECT EMPNO, ENAME, SAL, COMM
FROM EMP
WHERE EMPNO = 7863
OR EMPNO = 7834
OR EMPNO = 7844
OR EMPNO = 8000;
Si tiene tiempo, complete los ejercicios siguientes
Ejercicio 3: Modifique el archivo de comandos p19q1.sql para que inserte la f
rase 'El Número es impar' o 'El Número es impar' dependiendo
del valor que tenga en la tabla MESSAGES (Columna RESULTS). Cons
ulte la tabla MESSAGES para determinar si el bloque PL/SQL ha funcionado.
Trucamiento de la tabla MESSAGES:
---------------------------------
SQL> TRUNCATE TABLE MESSAGES;
Alteración de la tabla MESSAGES para que la columna RESULTS pueda
almacenar cadenas de caracteres:
----------------------------------------------------------------
----------------------------------
SQL> ALTER TABLE MESSAGES
MODIFY ( RESULTS VARCHAR2( 30 ) );
Ejecución del archivo de comandos p19q1.sql para inserción de datos:
----------------------------------------------------------------
----
SQL> start p19q1.sql
SQL> edit p19q3.sql
Contenido del archivo de comandos: p19q3.sql
--------------------------------------------
"
DECLARE
v_char VARCHAR2(30);
v_num NUMBER(11,2);
BEGIN
v_char := '42 es la respuesta';
v_num := TO_NUMBER( SUBSTR(v_char, 1, 2) );
IF mod( v_num, 2 ) = 0 THEN
INSERT INTO MESSAGES
VALUES ('El Número es par');
ELSE
INSERT INTO MESSAGES
VALUES ('El Número es impar');
END IF;
END;
/
"
SQL> start p19q3.sql
Verificación:
-------------
SQL> SELECT RESULTS
FROM MESSAGES;
Ejercicio 4: Agregue una columna nueva llamada STARS, de tipo de dato VARCHAR
2 y tamaño 50, en la tabla EMP para almacenar símbolos de asteriscos (*).
SQL> ALTER TABLE EMP
ADD ( STARS VARCHAR2(50) );
Ejercicio 5: Cree un Bloque PL/SQL que recompense a un empleado añadiéndo un símbol
o de asterisco en la columna STARS por cada $100 del salario del empleado.
Guarde el Bloque PL/SQL a un archivo nombrándolo p19q5.sql.
a) Acepte el ID de empleado como entrada del usuario con una var
iable de sustitución de SQL*PLUS
b) Inicialice la variable que contendrá una cadena de asteriscos
c) Agregue un asterisco a la cadena por cada $100 del salario de
l empleado. Por ejemplo,
si el empleado tiene un salario de $800, la cadena de asteris
cos debería contener ocho asteriscos.
Si el empleado tiene un salario de $1250, la cadena de asteri
scos debería contener trece asteriscos.
d) Actualice la columna STARS para el empleado con la cadena de
asteriscos que le corresponde
e) COMMIT
f) Testee el bloque para los empleados que no tienen salario y p
ara los empleados que tienen salario
"Por favor ingrese el número de empleado: 7834"
PL/SQL procedure successfully completed.
"Por favor ingrese el número de empleado: 8000"
PL/SQL procedure successfully completed.
EMPNO SAL STARS
----- --- ----------------
7834 1300 *************
8000 NULL
Respuestas 5.a), 5.b), 5.c), 5.d) y 5.e)
----------------------------------------
SQL> edit p19q5.sql
Contenido del archivo de comandos con el Bloque PL/SQL: p19q5.sq
l
----------------------------------------------------------------
-
"
ACCEPT p_emp_empno PROMPT 'Por favor ingrese el número de emp
leado: ';
DECLARE
v_emp_empno EMP.EMPNO%TYPE;
v_emp_stars EMP.STARS%TYPE;
v_emp_sal EMP.SAL%TYPE;
v_cant_ast NUMBER;
v_min NUMBER(3) := 1;
BEGIN
v_emp_empno := &p_emp_empno;
SELECT SAL
INTO v_emp_sal
FROM EMP
WHERE EMPNO = v_emp_empno;
v_cant_ast := v_emp_sal / 100;
SELECT LPAD( STARS, v_cant_ast, '*')
INTO v_emp_stars
FROM EMP
WHERE EMPNO = v_emp_empno;
UPDATE EMP
SET STARS = v_emp_stars
WHERE EMPNO = v_emp_empno;
COMMIT;
END;
/
"
Respuesta 5.f)
--------------
SQL> start p19q5.sql
Con el número de empleado: 7834
Sin error.
SQL> start p19q5.sql
Con el número de empleado: 8000
Con error: ORA-06502: PL/SQL: error numérico o de valor
ORA-06512: en línea 15
Verificación:
-------------
SQL> SELECT EMPNO, SAL, STARS
FROM EMP
WHERE EMPNO = 7834;
NO FUNCIONA
RESPUESTA DEL APÉNDICE A-70
---------------------------
Contenido del archivo de comandos con el Bloque PL/SQL: p19q5.sq
l
----------------------------------------------------------------
-
"
ACCEPT p_emp_empno PROMPT 'Por favor ingrese el número de emp
leado: ';
DECLARE
v_emp_empno EMP.EMPNO%TYPE := &p_emp_empno;
v_emp_stars EMP.STARS%TYPE := NULL;
v_emp_sal EMP.SAL%TYPE;
BEGIN
SELECT NVL( ROUND( SAL / 100 ), 0 )
INTO v_emp_sal
FROM EMP
WHERE EMPNO = v_emp_empno;
FOR i in 1..v_emp_sal LOOP
v_emp_stars := v_emp_stars || '*';
END LOOP;
UPDATE EMP
SET STARS = v_emp_stars
WHERE EMPNO = v_emp_empno;
COMMIT;
END;
/
"

Das könnte Ihnen auch gefallen