Está en la página 1de 11

Administración y Programación de Bases de Datos

Ejercicios
Ingeniería Civil Informática

Universidad del Bío-Bío

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 );

Observaciones: En la plataforma se encuentra un archivo “.sql” que puede ejecutar en SQLDeveloper,


además incluye algunas inserciones para facilitar el trabajo.
a) Realice una inserción a través de un bloque PL/SQL. Aquí pueden realizar una inserción en
cualquier tabla, con el procedimiento análogo puede hacer en cualquier tabla
1 DECLARE
2 run_data number ;
3 nombre_data va rcha r2 ( 6 0 ) ;
4 c a r r e r a _ d a t a va rcha r2 ( 8 0 ) ;
5 f e c h a _ n a c _ d a t a da te ;
6 BEGIN
7 run_data : = 1 1 2 2 2 3 3 3 ;
8 nombre_data : = ’ Tony S ta rk ’ ;
9 c a r r e r a _ d a t a : = ’ Ing . C i v i l en I n f o r m a t i c a ’ ;
10 − −TO_DATE ( ) para c o n v e r t i r t e x t o a un da te
11 f e c h a _ n a c _ d a t a : = TO_DATE( ’01 − 01 − 1990 ’ , ’dd−mm−yyyy ’ ) ;
12 INSERT INTO ALUMNO( run , nombre , c a r r e r a , f e c h a _ n a c ) VALUES
( run_data , nombre_data , c a r r e r a _ d a t a , f e c h a _ n a c _ d a t a ) ;
13 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 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;

También podría gustarte