Vous êtes sur la page 1sur 10

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

Práctica 15: Taller de SQL


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

Ejercicio 1:
Cree las tablas basadas en los diagramas de instancia de tablas siguient
es. Elija los tipos de datos apropiados
y asegúrese de agregar las restricciones de integridad.
Ejercicio 1.a Nombre de la tabla: MEMBER
Diagrama de Instancia de la Tabla MEMBER
----------------------------------------
NOMBRE_COLUMNA: MEMBER_ID LAST_NAME FIRST_NA
ME ADDRESS CITY PHONE JOIN_DATE
TIPO_DE_CLAVE: PK
NULL/UNIQUE: NN, U NN
NN
VALOR_PREDEFINIDO:
FECHA DEL SISTEMA
TIPO_DE_DATO: NUMBER VARCHAR2 VARCHAR2
VARCHAR2 VARCHAR2 VARCHAR2 DATE
TAMAÑO: 10 25 25
100 30 15
SQL> CREATE TABLE MEMBER (
MEMBER_ID NUMBER( 10 ),
LAST_NAME VARCHAR2( 25 ) NOT NULL
,
FIRST_NAME VARCHAR2( 25 ) NOT NULL
,
ADDRESS VARCHAR2( 100 ),
CITY VARCHAR2( 30 ),
PHONE VARCHAR2( 15 ),
JOIN_DATE DATE DEFAULT SYSDATE NOT NULL
,
CONSTRAINT MEMBER_MEMBER_ID_PK PRIMARY
KEY( MEMBER_ID ) );
SQL> save p15_1_a.sql
Nota: Al definir la Restricción de Clave Primaria sobre la columna
MEMBER_ID, no hace falta volver a definir la otra
restricción de clave única.
Ejercicio 1.b: Nombre de la tabla: TITLE
Diagrama de Instancia de la Tabla TITLE
----------------------------------------
NOMBRE_COLUMNA: TITLE_ID TITLE DESCRIPT
ION RATING CATEGORY RELEASE_DATE
TIPO_DE_CLAVE: PK
NULL/UNIQUE: NN, U NN NN
CHECK:
G, PG, R, DRAMA,
NC17, NR COMEDY,
ACTION,
CHILD,
SCIFI,
DOCUMENTARY
TIPO_DE_DATO: NUMBER VARCHAR2 VARCHAR2
VARCHAR2 VARCHAR2 DATE
TAMAÑO: 10 60 400
4 20
SQL> CREATE TABLE TITLE (
TITLE_ID NUMBER( 10 ) NOT NULL
,
TITLE VARCHAR2( 60 ) NOT NULL
,
DESCRIPTION VARCHAR2( 400 ) NOT NULL
,
RATING VARCHAR2( 4 ),
CATEGORY VARCHAR2( 20 ),
RELEASE_DATE DATE,
CONSTRAINT TITLE_TITLE_ID_PK PRIMARY
KEY( TITLE_ID ),
CONSTRAINT TITLE_RATING_CK CHECK( R
ATING IN ('G', 'PG', 'R', 'NC17', 'NR' ) ),
CONSTRAINT TITLE_CATEGORY_CK CHECK( C
ATEGORY IN ('DRAMA', 'COMEDY', 'ACTION', 'CHILD', 'SCIFI', 'DOCUMENTARY') ) );
SQL> save p15_1_b.sql
Ejerci
cio 1.c:
Nombre de la tabla: TITLE_COPY
Diagrama de Instancia de la Tabla TITLE_COPY
--------------------------------------------
NOMBRE_COLUMNA: COPY_ID TITLE_ID
STATUS
TIPO_DE_CLAVE: PK PK, FK
NULL/UNIQUE: NN, U NN, U
NN
CHECK:
AVAILABLE,
DESTROYED,
RENTED,
RESERVED
FK_TABLA_REFERENCIADA: TITLE
FK_COLUMNA_REFERENCIADA: TITLE_ID
TIPO_DE_DATO: NUMBER NUMBER
VARCHAR2
TAMAÑO: 10 10
15
SQL>CREATE TABLE TITLE_COPY
(
COPY_ID NUMBER( 10 ) NOT NULL,
TITLE_ID NUMBER( 10 ) NOT NULL
CONSTRAINT TITLE_COPY_TITLE_ID_FK REFERENCES TITLE( TITLE_ID ),
STATUS VARCHAR2( 15 ) NOT NULL,
CONSTRAINT TITLE_COPY_COPY_ID_TITLE_ID_PK
PRIMARY KEY ( COPY_ID, TITLE_ID ),
CONSTRAINT TITLE_COPY_STATUS_CK
CHECK( STATUS IN ('AVAILABLE', 'DESTROYED', 'RENTED', 'RESERVED') )
);
SQL> save p15_1_c.sql

Ejercicio 1.d:
Nombre de la tabla: RENTAL
Diagrama de Instancia de la Tabla RENTAL
--------------------------------------------
NOMBRE_COLUMNA: BOOK_DATE MEMBER_I
D COPY_ID ACT_RET_DATE EXP_RET_DATE TITLE_ID
TIPO_DE_CLAVE: PK PK, FK1
PK, FK2 PK, FK2
VALOR_PREDEFINIDO: Fecha de Sistema
Fecha de Sistema + 2 días
FK_TABLA_REFERENCIADA: MEMBER
TITLE_COPY TITLE_COPY
FK_COLUMNA_REFERENCIADA: MEMBER_I
D COPY_ID TITLE_ID
TIPO_DE_DATO: DATE NUMBER
NUMBER DATE DATE NUMBER
TAMAÑO: 10
10 10
SQL> CREATE TABLE RENTAL
(
BOOK_DATE DATE DEFAULT SYSDATE,
MEMBER_ID NUMBER( 10 ),
COPY_ID NUMBER( 10 ),
ACT_RET_DATE DATE,
EXP_RET_DATE DATE DEFAULT (SYSDATE
+ 2),
TITLE_ID NUMBER( 10 ),
CONSTRAINT RENTAL_BD_MI_CI_TI_PK
PRIMARY KEY( BOOK_DATE, MEMBER_ID, COPY_ID, TITLE_ID ),
CONSTRAINT RENTAL_MEMBER_ID_FK_1
FOREIGN KEY( MEMBER_ID ) REFERENCES MEMBER ( MEMBER_ID ),
CONSTRAINT RENTAL_COPY_ID_TITLE_ID_FK_2
FOREIGN KEY( COPY_ID, TITLE_ID ) REFERENCES TITLE_COPY( COPY_ID, TITLE_ID )
);

SQL> save p15_1_d.sql


________________________________
<<<[ NOTA: FALTAN HOJAS 15-5 y 15-6 ]>>>
----------------------------------
Ejercicio 4: ...Falta texto...
Ejercicio 4.a: Inserte datos en la Tabla TITLE, de acuerdo a la siguiente tabla
. Use una Secuencia para la columna TITLE_ID.
DATOS DE LA TABLA TITLE:
------------------------
TITLE DESCRIPTION RATING
CATEGORY RELEASE_DATE
----- ----------- ------
-------- ------------
Willie and Todos los Amigos de Willie G
CHILD 05-OCT-1995
Christmas hacen una lista de navidad
Too para Papa Noel, pero Willie
todavía no ha añadido su
deseo en la lista.
Alien Again Otra instalación de historia R
SCIFI 19-MAY-1995
de Ciencia Ficción. La heroína
puede salvar al planeta de la
amenaza de la forma de vida
extraterrestre.
The Glob Un meteoro cae cerca de un NR
SCIFI 12-AUG-1995
pequeño pueblo Americano y
libera basura cósmica
carnívora en este clásico.
My Day Off Con un poco de suerte y mucha PG
COMEDY 12-JUL-1995
ingenuidad, un adolescente
falta a clases por un día
en Nueva York.
Miracles Una niña de 6 años tiene dudas PG
DRAMA 12-SEP-1995
On Ices acerca de la existencia de
Papa Noel, pero descubre que
el milagro realmente existe.
Soda Gang Después de descubrir una NR ACTION
01-JUN-1995
cantidad de drogas, un joven
se encuentra enganchado y
adicto y se vuelve un ganster
mafioso.
SQL> CREATE SEQUENCE TITLE_TITLE_ID_SEQ
INCREMENT BY 1
START WITH 1;
SQL> INSERT INTO TITLE
VALUES (
TITLE_TITLE_ID_SEQ.NEXTVAL,
'Willie and Christmas Too',
'Todos los Amigos de Willie hacen una li
sta de navidad para Papa Noel, pero Willie todavía no ha añadido su deseo en la list
a.',
'G',
'CHILD',
'05-OCT-1995'
);
SQL> save p15_4_a_1.sql
SQL> INSERT INTO TITLE
VALUES (
TITLE_TITLE_ID_SEQ.NEXTVAL,
'Alien Again',
'Otra instalación de historia de Ciencia F
icción. La heroína puede salvar al planeta de la amenaza de la forma de vida extrate
rrestre.',
'R',
'SCIFI',
'19-MAY-1995'
);
SQL> save p15_4_a_2.sql
SQL> INSERT INTO TITLE
VALUES (
TITLE_TITLE_ID_SEQ.NEXTVAL,
'The Glob',
'Un meteoro cae cerca de un pequeño pueblo
Americano y libera basura cósmica carnívora en este clásico.',
'NR',
'SCIFI',
'12-AGO-1995'
);
SQL> save p15_4_a_3.sql
SQL> INSERT INTO TITLE
VALUES (
TITLE_TITLE_ID_SEQ.NEXTVAL,
'My Day Off',
'Con un poco de suerte y mucha ingenuida
d, un adolescente falta a clases por un día en Nueva York.',
'PG',
'COMEDY',
'12-JUL-1995'
);
SQL> save p15_4_a_4.sql
SQL> INSERT INTO TITLE
VALUES (
TITLE_TITLE_ID_SEQ.NEXTVAL,
'Miracles on Ice',
'Una niña de 6 años tiene dudas acerca de la
existencia de Papa Noel, pero descubre que el milagro realmente existe.',
'PG',
'DRAMA',
'12-SEP-1995'
);
SQL> save p15_4_a_5.sql
SQL> INSERT INTO TITLE
VALUES (
TITLE_TITLE_ID_SEQ.NEXTVAL,
'Soda Gang',
'Después de descubrir una cantidad de drog
as, un joven se encuentra enganchado y adicto y se vuelve un ganster mafioso.',
'NR',
'ACTION',
'01-JUN-1995'
);
SQL> save p15_4_a_6.sql
Ejercicio 4.b: Agregue los datos a la tabla MEMBER. Escriba un archivo de coman
dos (Script) nombrándolo p15q4b.sql para solicitarle en pantalla, la
información al usuario. Ejecute el archivo de comandos. Asegúrese de
usar una secuencia para añadir los números de miembros.
LAST_NAME FIRST_NAME ADDRESS CITY
PHONE JOINT_DATE
--------- ---------- ------- ----
----- ----------
Velasquez Carmen 283 King Street Seatle
206-899-6666 08-MAR-1990
Ngao LaDoris 5 Mondrany Bratisla
va 586-355-8882 08-MAR-1990
Nagayama Midori 68 Via Centrale Sao Paol
o 254-852-5764 17-JUN-1991
Quick-to-See Mark 6921 King Way Lagos
63-559-7777 07-ABR-1990
Ropeburn Audry 86 Chu Street Hong Kon
g 41-559-87 18-ENE-1991
Urguhart Molly 3035 Laurier Quebec
418-542-9988 18-ENE-1991

SQL> CREATE SEQUENCE MEMBER_MEMBER_ID_SEQ


INCREMENT BY 1
START WITH 1;
SQL> edit p15q4b.sql
Contenido del Archivo de comandos: p15q4b.sql
---------------------------------------------
"
ACCEPT last_name PROMPT 'Ingrese el Apellido: '
ACCEPT first_name PROMPT 'Ingrese el Nombre: '
ACCEPT address PROMPT 'Ingrese el domicilio: '
ACCEPT city PROMPT 'Ingrese la ciudad: '
ACCEPT phone PROMPT 'Ingrese el número de teléfono: '
ACCEPT joint_date PROMPT 'Ingrese la fecha de ingreso: '
INSERT INTO MEMBER
VALUES (
MEMBER_MEMBER_ID_SEQ.NEXTVAL,
'&last_name',
'&first_name',
'&address',
'&city',
'&phone',
'&joint_date'
);
"
SQL> start p15q4b.sql
SQL> start p15q4b.sql
SQL> start p15q4b.sql
SQL> start p15q4b.sql
SQL> start p15q4b.sql
SQL> start p15q4b.sql
Ejercicio 4.c: Agregue los datos de las copias de películas en la tabla TITLE_COP
Y
Nota: Tenga disponible los valores de la columna TITLE_ID de la
tabla TITLE para realizar este ejercicio.
Datos de la tabla: TITLE_COPY
-----------------------------
COPY_ID TITLE ===> TITLE_ID
STATUS
------- ----- --------
------
1 Willie and Christmas Too 1
AVAILABLE
1 Alien Again 2
AVAILABLE
2 Alien Again 2
RENTED
1 The Glob 4
AVAILABLE
1 My Day Off 5
AVAILABLE
2 My Day Off 5
AVAILABLE
3 My Day Off 5
RENTED
1 Miracles On Ice 6
AVAILABLE
1 Soda Gang 7
AVAILABLE

SQL> SELECT TITLE_ID, TITLE


FROM TITLE;
TITLE_ID TITLE
-------- -----
1 Willie and Christmas Too
2 Allien Again
4 The Glob
5 My Day Off
6 Miracles on Ice
7 Soda Gang
SQL> INSERT INTO TITLE_COPY
VALUES ( 1, 1, 'AVAILABLE' );
SQL> save p15q4c_1.sql
SQL> INSERT INTO TITLE_COPY
VALUES ( 1, 2, 'AVAILABLE' );
SQL> save p15q4c_2.sql
SQL> INSERT INTO TITLE_COPY
VALUES ( 2, 2, 'RENTED' );
SQL> save p15q4c_3.sql
SQL> INSERT INTO TITLE_COPY
VALUES ( 1, 4, 'AVAILABLE' );
SQL> save p15q4c_4.sql
SQL> INSERT INTO TITLE_COPY
VALUES ( 1, 5, 'AVAILABLE' );
SQL> save p15q4c_5.sql
SQL> INSERT INTO TITLE_COPY
VALUES ( 2, 5, 'AVAILABLE' );
SQL> save p15q4c_6.sql
SQL> INSERT INTO TITLE_COPY
VALUES ( 3, 5, 'RENTED' );
SQL> save p15q4c_7.sql
SQL> INSERT INTO TITLE_COPY
VALUES ( 1, 6, 'AVAILABLE');
SQL> save p15q4c_8.sql
SQL> INSERT INTO TITLE_COPY
VALUES ( 1, 7, 'AVAILABLE');
SQL> save p15q4c_9.sql
Ejercicio 4.d: Agregue los datos de alquileres siguientes a la tabla RENTAL.
Nota: Los números de los títulos y de los miembros pueden ser dife
rentes dependiendo de los números de la secuencia.
Datos de la tabla RENTAL
------------------------
BOOK_DATE MEMBER_ID COPY_ID ACT_RET_DATE
EXP_RET_DATE TITLE_ID
--------- --------- ------- ------------
------------ --------
16-DIC-2010 1 1 17-DIC-2010
18-DIC-2010 1
18-DIC-2010 1 2
20-DIC-2010 2
17-DIC-2010 2 3
19-DIC-2010 5
15-DIC-2010 6 1 17-DIC-2010
17-DIC-2010 7
SQL> INSERT INTO RENTAL
VALUES ('16-DIC-2010', 1, 1, '17-DIC-2010', '18-DIC-201
0', 1);
SQL> save p15q4d_1.sql
SQL> INSERT INTO RENTAL
VALUES ('18-DIC-2010', 1, 2,NULL ,'20-DIC-2010', 2);
SQL> save p15q4d_2.sql
SQL> INSERT INTO RENTAL
VALUES ('17-DIC-2010', 2, 3, NULL, '19-DIC-2010', 5);
SQL> save p15q4d_3.sql
SQL> INSERT INTO RENTAL
VALUES ('15-DIC-2010', 6, 1, '17-DIC-2010', '17-DIC-201
0', 7);
SQL> save p15q4d_4.sql
Ejercicio 5: Cree una vista llamada TITLE_AVAIL para mostrar los títulos de las
películas y la
disponibilidad de cada copia y su día de retorno esperado si es qu
e fue rentada.
Consulte todos los registros/filas desde la vista. Ordene el res
ultado de la consulta
por la columna TITLE.
SQL> CREATE VIEW TITLE_AVAIL
AS SELECT t.TITLE, tc.COPY_ID, tc.STATUS, r.EXP_RE
T_DATE
FROM TITLE t, TITLE_COPY tc, RENTAL r
WHERE t.TITLE_ID = tc.TITLE_ID
AND tc.COPY_ID = r.COPY_ID ;
SQL> SELECT *
FROM TITLE_AVAIL
ORDER BY TITLE_AVAIL.TITLE;
SQL> CREATE OR REPLACE VIEW TITLE_AVAIL
AS SELECT t.TITLE, tc.COPY_ID, tc.STATUS, r.EXP_RE
T_DATE
FROM TITLE t, TITLE_COPY tc, RENTAL r
WHERE t.TITLE_ID = tc.TITLE_ID
AND tc.COPY_ID = r.COPY_ID(+)
AND tc.TITLE_ID = r.TITLE_ID(+) ;
SQL> SELECT *
FROM TITLE_AVAIL
ORDER BY TITLE, COPY_ID;
________________________________
<<<[Nota: Se abandona la Práctica 15]>>>
__________________________________
<<<[Causa: Hojas faltantes 15-5 y 15-6]>>>
------------------------------------