Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guia Ejercicios Solucion
Guia Ejercicios Solucion
Ejercicios
Ingeniería Civil Informática
Guillermo Fuentes
Otoño 2020
1. Ejercicios
1. Para conocer la similitud de PL/SQL con un lenguaje de programación típico (JAVA, C++, etc)
examine y ejecute el siguiente bloque:
1 DECLARE
2 i number ;
3 j number ;
4 BEGIN
5 i := 1;
6 WHILE ( i <= 1 0 ) LOOP
7 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−’) ;
8 DBMS_OUTPUT. PUT_LINE ( ’ Ta bla d e l ’ || i ) ;
9 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−’) ;
10 j := 1;
11 WHILE ( j <= 1 0 ) LOOP
12 DBMS_OUTPUT. PUT_LINE ( i || ’ x ’ || j || ’ = ’ || i ∗ j ) ;
13 j := j + 1;
14 END LOOP;
15 i := i + 1;
16 END LOOP;
17 END;
2. Ahora modifique el anterior bloque para muestre solo aquellas multiplicaciones que tengan como
resultado un valor superior o igual a 10.
1 DECLARE
2 i number ;
3 j number ;
4 r e s u l t a d o number ;
5 BEGIN
6 i := 1;
7 WHILE ( i <= 1 0 ) LOOP
8 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−’) ;
9 DBMS_OUTPUT. PUT_LINE ( ’ Ta bla d e l ’ || i ) ;
10 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−’) ;
11 j := 1;
12 WHILE ( j <= 1 0 ) LOOP
13 resultado := i ∗ j ;
14 IF ( r e s u l t a d o >= 1 0 ) THEN
15 DBMS_OUTPUT. PUT_LINE ( i || ’ x ’ || j || ’ = ’ ||
resultado ) ;
16 END IF ;
17 j := j + 1;
18 END LOOP;
19 i := i + 1;
20 END LOOP;
21 END;
3. Modifique el bloque anterior para utiliza un FOR en vez de un WHILE.
1 DECLARE
2 i number ;
3 j number ;
4 r e s u l t a d o number ;
5 BEGIN
6 FOR i i n 1 . . 1 0 LOOP
7 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−’) ;
8 DBMS_OUTPUT. PUT_LINE ( ’ Ta bla d e l ’ || i ) ;
9 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−’) ;
10 FOR j i n 1 . . 1 0 LOOP
11 resultado := i ∗ j ;
12 IF ( r e s u l t a d o >= 1 0 ) THEN
13 DBMS_OUTPUT. PUT_LINE ( i || ’ x ’ || j || ’ = ’ ||
resultado ) ;
14 END IF ;
15 END LOOP;
16 END LOOP;
17 END;
4. Basados en la siguiente estructura, realice los ejercicios que se detallan a continuación
1 CREATE TABLE p r o f e s o r (
2 run INT PRIMARY KEY,
3 nombre VARCHAR( 6 0 ) NOT NULL,
4 departamento VARCHAR( 1 0 0 ) NOT NULL
5 );
6
7 CREATE TABLE alumno (
8 run INT PRIMARY KEY,
9 nombre VARCHAR( 6 0 ) NOT NULL,
10 c a r r e r a VARCHAR( 8 0 ) NOT NULL
11 );
12
13 CREATE TABLE s a l a (
14 numero VARCHAR( 3 ) PRIMARY KEY,
15 capacidad INT NOT NULL,
16 ac INT DEFAULT 1 NOT NULL
17 );
18
19 CREATE TABLE curso (
20 codigo VARCHAR( 3 ) PRIMARY KEY,
21 nombre VARCHAR( 6 0 ) NOT NULL,
22 hora s INT NOT NULL CHECK ( hora s > 2 ) ,
23 num VARCHAR( 3 ) REFERENCES s a l a ( numero )
24 );
25
26 CREATE TABLE c u r s a r (
27 run INT REFERENCES alumno ( run ) ,
28 cod VARCHAR( 3 ) REFERENCES curso ( codigo ) ,
29 semestre INT NOT NULL CHECK ( semestre = 1 OR semestre = 2 ) ,
30 a nio INT NOT NULL CHECK ( a nio > 1 9 8 0 ) ,
31 nota NUMERIC( 3 , 2 ) NOT NULL CHECK ( nota >= 1 . 0 0 AND nota <= 7 . 0 ) ,
32 CONSTRAINT cursa r_ pk PRIMARY KEY ( run , cod , semestre , a nio )
33 );
34
35 CREATE TABLE d i c t a r (
36 run INT REFERENCES p r o f e s o r ( run ) ,
37 cod VARCHAR( 3 ) REFERENCES curso ( codigo ) ,
38 semestre INT NOT NULL CHECK ( semestre = 1 OR semestre = 2 ) ,
39 a nio INT NOT NULL CHECK ( a nio > 1 9 8 0 ) ,
40 CONSTRAINT d i c t a r _ p k PRIMARY KEY ( run , cod , semestre , a nio )
41 );
1 DECLARE
2 alumno_data alumno %ROWTYPE ;
3 BEGIN
4 alumno_data . run : = 1 1 3 3 3 4 4 4 ;
5 alumno_data . nombre : = ’ Tony S t a r k 2 ’ ;
6 alumno_data . c a r r e r a : = ’ Ing . C i v i l en I n f o r m a t i c a ’ ;
7 alumno_data . f e c h a _ n a c : = TO_DATE( ’01 − 01 − 1992 ’ , ’dd−mm−yyyy ’ ) ;
8 INSERT INTO ALUMNO VALUES alumno_data ;
9 END;
b) Actualice un tupla (basado en la selección de un atributo/columna a elección) a través de un
bloque.
1 DECLARE
2 run_data number ;
3 nombre_data va rcha r2 ( 6 0 ) ;
4 BEGIN
5 run_data : = 1 1 2 2 2 3 3 3 ;
6 nombre_data : = ’ I r o n Man ’ ;
7 UPDATE ALUMNO SET nombre = nombre_data WHERE run = run_data ;
8 END;
1 DECLARE
2 alumno_data alumno %ROWTYPE ;
3 BEGIN
4 alumno_data . run : = 1 1 3 3 3 4 4 4 ;
5 alumno_data . nombre : = ’ Tony S t a r k 2 ’ ;
6 alumno_data . c a r r e r a : = ’ Ing . C i v i l en I n f o r m a t i c a ’ ;
7 alumno_data . f e c h a _ n a c : = TO_DATE( ’01 − 01 − 1992 ’ , ’dd−mm−yyyy ’ ) ;
8 UPDATE ALUMNO SET ROW = alumno_data WHERE run = alumno_data . run ;
9 END;
Observaciones: puede utilizar un ROWTYPE para insertar o actualizar una tupla
1 −− INSERT
2 DECLARE
3 emp_rec emp % ROWTYPE ;
4 BEGIN
5 SELECT ∗ INTO emp_rec FROM emp WHERE empno= 7 9 0 2 ;
6 emp_rec . empno : = 1 ;
7 INSERT i n t o emp VALUES emp_rec ;
8 END;
9
10 −−UPDATE
11 DECLARE
12 emp_rec emp % ROWTYPE ;
13 BEGIN
14 SELECT ∗ INTO emp_rec FROM emp WHERE empno= 7 9 0 0 ;
15 emp_rec . empno : = 7 9 0 1 ;
16 UPDATE emp SET ROW = emp_rec WHERE empno=emp_rec . empno ;
17 END;
c) Cree un bloque que muestre el rut y nombre de los alumnos con el siguiente formato:
1 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
2 RUT: EJEMPLO
3 NOMBRE: EJEMPLO
4 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
1 DECLARE
2 CURSOR alumnos I S SELECT ∗ FROM alumno ;
3 a l u _ d a t a alumno %
ROWTYPE ;
4 BEGIN
5 FOR a l u _ d a t a IN alumnos LOOP
6 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
7 DBMS_OUTPUT. PUT_LINE ( ’RUT : ’ || a l u _ d a t a . run ) ;
8 DBMS_OUTPUT. PUT_LINE ( ’NOMBRE: ’ || a l u _ d a t a . nombre ) ;
9 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
10 END LOOP;
11 END;
d) Modifique el bloque anterior con el objetivo de que sólo muestre aquellos alumnos que tengan
más de 21 años de edad.
1 DECLARE
2 CURSOR alumnos I S SELECT ∗ FROM alumno ;
3 a l u _ d a t a alumno % ROWTYPE ;
4 a nio i n t e g e r ;
5 BEGIN
6 FOR a l u _ d a t a IN alumnos LOOP
7 a nio : = EXTRACT(YEAR FROM SYSDATE) − EXTRACT(YEAR FROM
alu_data . fecha_nac ) ;
8 IF ( a nio > 2 1 ) THEN
9 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
10 DBMS_OUTPUT. PUT_LINE ( ’RUT : ’ || a l u _ d a t a . run ) ;
11 DBMS_OUTPUT. PUT_LINE ( ’NOMBRE: ’ || a l u _ d a t a . nombre ) ;
12 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
13 END IF ;
14 END LOOP;
15 END;
e) Cree un bloque que muestre el número de tuplas de las tablas creadas con el siguiente formato
de salida:
1 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
2 NOMBRE TABLA: EJEMPLO
3 NRO TUPLAS : N
4 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
1 DECLARE
2 cant_tuplas integer ;
3 BEGIN
4 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
5 DBMS_OUTPUT. PUT_LINE ( ’TABLA: ALUMNO’ ) ;
6 SELECT COUNT( ∗ ) INTO c a n t _ t u p l a s FROM alumno ;
7 DBMS_OUTPUT. PUT_LINE ( ’NRO TUPLAS : ’ || c a n t _ t u p l a s ) ;
8 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
9
10 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
11 DBMS_OUTPUT. PUT_LINE ( ’TABLA: CURSO’ ) ;
12 SELECT COUNT( ∗ ) INTO c a n t _ t u p l a s FROM curso ;
13 DBMS_OUTPUT. PUT_LINE ( ’NRO TUPLAS : ’ || c a n t _ t u p l a s ) ;
14 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
15
16 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
17 DBMS_OUTPUT. PUT_LINE ( ’TABLA: CURSAR’ ) ;
18 SELECT COUNT( ∗ ) INTO c a n t _ t u p l a s FROM c u r s a r ;
19 DBMS_OUTPUT. PUT_LINE ( ’NRO TUPLAS : ’ || c a n t _ t u p l a s ) ;
20 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
21
22 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
23 DBMS_OUTPUT. PUT_LINE ( ’TABLA: PROFESOR’ ) ;
24 SELECT COUNT( ∗ ) INTO c a n t _ t u p l a s FROM p r o f e s o r ;
25 DBMS_OUTPUT. PUT_LINE ( ’NRO TUPLAS : ’ || c a n t _ t u p l a s ) ;
26 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
27
28 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
29 DBMS_OUTPUT. PUT_LINE ( ’TABLA: DICTAR ’ ) ;
30 SELECT COUNT( ∗ ) INTO c a n t _ t u p l a s FROM d i c t a r ;
31 DBMS_OUTPUT. PUT_LINE ( ’NRO TUPLAS : ’ || c a n t _ t u p l a s ) ;
32 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
33
34 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
35 DBMS_OUTPUT. PUT_LINE ( ’TABLA: SALA’ ) ;
36 SELECT COUNT( ∗ ) INTO c a n t _ t u p l a s FROM s a l a ;
37 DBMS_OUTPUT. PUT_LINE ( ’NRO TUPLAS : ’ || c a n t _ t u p l a s ) ;
38 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
39 END;
Si se quiere algo más automatizado
1 DECLARE
2 CURSOR t a b l a s I S SELECT ∗ FROM USER_TABLES ;
3 cant_tuplas integer ;
4 t a b l a ALL_TABLES %ROWTYPE ;
5 BEGIN
6 FOR t a b l a IN t a b l a s LOOP
7 EXECUTE IMMEDIATE ’SELECT COUNT( ∗ ) FROM ’ || t a b l a . table_name
INTO c a n t _ t u p l a s ;
8 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
9 DBMS_OUTPUT. PUT_LINE ( ’TABLA: ’ || t a b l a . table_name ) ;
10 DBMS_OUTPUT. PUT_LINE ( ’NRO TUPLAS : ’ || c a n t _ t u p l a s ) ;
11 DBMS_OUTPUT. PUT_LINE(’−−−−−−−−−−−−−−−−−−−−−−−−−’) ;
12 END LOOP;
13 END;