Talleres BD1

60
Talleres del Curso BDI Carlos Alberto Olarte ([email protected]) Enero 2003

description

DB, Ejercicios BD

Transcript of Talleres BD1

Page 1: Talleres BD1

Talleres del Curso BDI

Carlos Alberto Olarte ([email protected])

Enero 2003

Page 2: Talleres BD1

Indice general

1. Introduccion 5

2. SQL+ y la Consola de Comandos 62.1. Ingreso a SQL+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.1.1. Login y Password . . . . . . . . . . . . . . . . . . . . . . . . . . 62.1.2. String de Conexion . . . . . . . . . . . . . . . . . . . . . . . . . 62.1.3. Ingreso a SQL+ desde Windows . . . . . . . . . . . . . . . . . . 62.1.4. Ingreso a SQL+ desde Linux . . . . . . . . . . . . . . . . . . . . 72.1.5. Cambio de Password . . . . . . . . . . . . . . . . . . . . . . . . 7

2.2. Ejecucion de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . 82.2.1. Buffer SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.2.2. Utilidades de edicion . . . . . . . . . . . . . . . . . . . . . . . . 82.2.3. Almacenamiento del Buffer . . . . . . . . . . . . . . . . . . . . . 8

2.3. Archivos SQL (Scripts) . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.4. Comandos Interactivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3. Insercion, eliminacion y modificacion de registros 113.1. INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.2. DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.3. Actualizacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.4. Practica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

4. Modelado de Bases de Datos 144.1. Descripcion del problema . . . . . . . . . . . . . . . . . . . . . . . . . . 144.2. Practica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4.2.1. Modelo E/R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.2.2. DSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.2.3. Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

5. Scripts de Tablas 165.1. Creacion de Tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165.2. Adicion de llaves primarias . . . . . . . . . . . . . . . . . . . . . . . . . 165.3. Adicion de llaves foraneas . . . . . . . . . . . . . . . . . . . . . . . . . 175.4. Adicion de Restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5.4.1. Valor unico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

1

Page 3: Talleres BD1

INDICE GENERAL 2

5.4.2. Validaciones de Entrada . . . . . . . . . . . . . . . . . . . . . . 175.5. Practica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

6. Creacion de Tipos de Datos en Oracle 196.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196.2. Creacion de Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196.3. Eliminacion de Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206.4. Creacion de Tablas de Objetos . . . . . . . . . . . . . . . . . . . . . . . 206.5. Composicion de Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . 206.6. Creacion de Tablas Anidadas . . . . . . . . . . . . . . . . . . . . . . . 216.7. Operador THE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236.8. Referencia a Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236.9. Practica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

7. Introduccion a PL/SQL y Cursores 267.1. Bloques en PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267.2. Estructuras de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

7.2.1. Condicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267.2.2. Ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

7.3. Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287.3.1. Registros (Estructuras) . . . . . . . . . . . . . . . . . . . . . . . 28

7.4. Cursores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297.4.1. Cursores Parametrizables . . . . . . . . . . . . . . . . . . . . . . 30

7.5. Practica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

8. Funciones y Procedimientos en PL/SQL 328.1. Creacion de un Procedimiento . . . . . . . . . . . . . . . . . . . . . . . 32

8.1.1. Or Replace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328.1.2. Argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328.1.3. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348.1.4. Eliminacion de Procedimientos . . . . . . . . . . . . . . . . . . 35

8.2. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358.2.1. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

8.3. Diccionario de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368.4. Practica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

9. Paquetes en PL/SQL 389.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389.2. Especificacion de un Paquete . . . . . . . . . . . . . . . . . . . . . . . . 38

9.2.1. Sobrecarga de funciones . . . . . . . . . . . . . . . . . . . . . . 389.3. Cuerpo del Paquete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399.4. Invocacion de los elementos de los paquetes . . . . . . . . . . . . . . . . 399.5. Inicializacion de un Paquete . . . . . . . . . . . . . . . . . . . . . . . . 399.6. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409.7. Practica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Page 4: Talleres BD1

INDICE GENERAL 3

10.Triggers (Disparadores) 4410.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4410.2. Creacion de Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4410.3. Restricciones de los disparadores . . . . . . . . . . . . . . . . . . . . . . 4510.4. Eliminacion y desactivacion de triggers . . . . . . . . . . . . . . . . . . 4510.5. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

10.5.1. Predicados de los disparadores . . . . . . . . . . . . . . . . . . . 4610.5.2. Pseudo-Variables :NEW y :OLD . . . . . . . . . . . . . . . . . . 47

10.6. Practica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

11.Manejo de Errores 4811.1. Declaracion de Excepciones . . . . . . . . . . . . . . . . . . . . . . . . 48

11.1.1. Excepciones predefinidas en Oracle . . . . . . . . . . . . . . . . 4911.2. Captura de Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . 4911.3. Lanzamiento de Excepciones . . . . . . . . . . . . . . . . . . . . . . . . 5011.4. SQLERRM, SQLCODE . . . . . . . . . . . . . . . . . . . . . . . . . . 5011.5. Ambito de las Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . 5111.6. Practicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

12.Temas adicionales SQL 5212.1. Vistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5212.2. Sinonimos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5312.3. Indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5312.4. Secuencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

13.Consultas 5513.1. Creacion de Tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5513.2. Inserciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5613.3. Consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Page 5: Talleres BD1

Indice de figuras

5.1. E/R Telefonıa Celular . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

4

Page 6: Talleres BD1

Capıtulo 1

Introduccion

El siguiente documento presenta una serie de talleres que se deben realizar duranteel curso de Bases de Datos I, con el fin de fortalecer la teorıa vista en clase y adquirirhabilidades en el uso de SQL para crear (DDL) y manipular (DML) bases de datosrelacionales. Adicionalmente se presentan algunos temas de PL/SQL para que el es-tudiante implemente funciones, procedimientos, triggers, etc sobre una base de datosORACLE como un acercamiento a los diferentes lenguajes que existen en el mercadopara la programacion en Bases de Datos.

5

Page 7: Talleres BD1

Capıtulo 2

SQL+ y la Consola de Comandos

Este taller pretende familiarizar al estudiante con el uso de la consola de comandosSQL*PLUS de Oracle ası como con sus facilidades para dar formato a las consultasejecutadas.

2.1. Ingreso a SQL+

El ingreso a SQL+ se lleva a cabo de acuerdo al sistema operativo sobre el cual sehaya instalado el cliente para acceder a la base de datos. Normalmente en los clientesWindows, existe un Item del menu con el Nombre SQL PLUS. En los clientes Unix, sedebe digitar el comando sqlplus.

2.1.1. Login y Password

El login y password se refieren a los usuarios creados en el servidor de la base dedatos.

2.1.2. String de Conexion

Se refiere al nombre asignado en la configuracion de conexion a la base de datos.Dicha conexion tiene en cuenta el servidor de la base de datos (HOST), puerto deescucha (normalmente el 1521) y el nombre de la instancia de Oracle (SID).

2.1.3. Ingreso a SQL+ desde Windows

En las salas de la Universidad, se encuentra instalado las aplicaciones cliente deOracle. Para conectarse A SQL+, se buscar el icono en el menu de inicio. El login ypassword se asignan al principio del semestre por estudiante. El String de Conexion esacademico para acceder a la Base de Datos destinada para el uso de estudiantes en elCSI 1.

1Centro de Servicios Informaticos

6

Page 8: Talleres BD1

CAPITULO 2. SQL+ Y LA CONSOLA DE COMANDOS 7

2.1.4. Ingreso a SQL+ desde Linux

En el servidor linuxlab de la sala Linux, se encuentra disponible una instancia deOracle para uso academico. Para acceder a ella se deben seguir los siguientes pasos:

1. Ingresar al servidor linuxlab:

ssh [email protected]

password:xxxxxx

El login y password es el asignado por estudiante para sus cuentas de Linux en lasala.

2. Configurar las variables de ambiente propias de Oracle:

export ORACLE_SID=lab

export ORACLE_BASE=/ora01

export ORACLE_HOME=$ORACLE_BASE/product/9i

export PATH=$PATH:$ORACLE_HOME/bin

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib

La variable ORACLE SID indica el nombre de la instancia de la base de datosy ORACLE HOME el directorio donde se encuentran instalados los binariosde Oracle. Estas variables pueden escribirse en el archivo .bashrc para que seanconfiguradas cada que se inicia una sesion sobre el servidor.

3. Ingresar a la base de datos:

oracle@linuxlab:~$ sqlplus login

password:xxxx

El login y password de la base de datos son asignados al principio del semestrepor estudiante.

4. Una vez finalizada la sesion en la consola SQL+, se utiliza exit para retornar alsistema operativo.

2.1.5. Cambio de Password

Es aconsejable que al iniciar por primera vez la consola SQL+ tanto en windowscomo en linux, se cambie el password asignado. Esto se puede realizar en ambos casoscon el siguiente comando (desde la consola SQL+):

ALTER USER LOGIN

IDENTIFIED BY PASSWORD;

Page 9: Talleres BD1

CAPITULO 2. SQL+ Y LA CONSOLA DE COMANDOS 8

2.2. Ejecucion de Comandos

Los comandos se ejecutan en la consola SQL. Cada que se termina un comando sedebe digitar punto y coma (;).Si un comando se quiere volver a ejecutar, se debe digitar el comando RUN o simple-mente utilizar el caracter slash (/).

2.2.1. Buffer SQL

Los comandos digitados en la consola SQL son almacenados en el Buffer de la misma.Dicho Buffer puede ser modificado con las instrucciones descritas en la siguiente seccion.

2.2.2. Utilidades de edicion

Los siguientes comandos tienen un significado especial para la consola SQL y puedenutilizarse para editar mas facilmente los comandos:

APPEND (A) TEXT Adiciona el texto del parametro al final de la linea actual

CHANGE (C) /OLD/NEW Reemplaza la primera ocurrencia de OLD por NEW

CHANGE (C) /TEXT Elimina la primera ocurrencia de TEXT

CLEAR BUFFER (CL BUFF) Elimina el contenido del Buffer

DEL Elimina una lınea

INPUT (I)TEXT Adiciona el una nueva lınea con el texto especificado

LIST (L) Muestra el contenido del Buffer

2.2.3. Almacenamiento del Buffer

En cualquier instante, se puede almacenar el contenido del Buffer en un archivo delsistema operativo. Los comandos para el almacenamiento del buffer son los siguientes:

EDITOR (ED) Permite editar el contenido del Buffer en el editor predeterminadodel Sistema Operativo (Notepad por ejemplo)

SAVE file Almacena el contenido del Buffer en el archivo file

GET file Copia el contenido de file en el Buffer

START file o @file Ejecuta las instrucciones SQL contenidas en file

Page 10: Talleres BD1

CAPITULO 2. SQL+ Y LA CONSOLA DE COMANDOS 9

2.3. Archivos SQL (Scripts)

Para hacer mas sencilla la interaccion con SQL, se escriben archivos (con extension.sql normalmente) los cuales contienen varias instrucciones SQL y son conocidos comoScripts. Dichos scripts son modificados en un editor del sistema operativo y luego sonejecutados con los comandos de la seccion anterior. Dichos scripts pueden contenercomentarios bien sea encerrados en /** **/ o iniciando la lınea con doble guion (-). Acontinuacion se presenta un ejemplo:

-- Creacion de la tabla Personas

Prompt Creando la tabla persona

CREATE TABLE PERSONAS (

CODIGO NUMBER (10) PRIMARY KEY,

NOMBRE VARCHAR2(40) NOT NULL,

DIRECCION VARCHAR2(40) NOT NULL,

EDAD NUMBER(3) NOT NULL

);

INSERT INTO PERSONAS (CODIGO,NOMBRE,DIRECCION,EDAD)

VALUES(1,’JUAN RAMIREZ’,’CRA 30’,28);

2.4. Comandos Interactivos

Es posible implementar comandos interactivos en una sesion SQL+ con ayuda deloperador &. A continuacion se muestra un ejemplo:

SQL> INSERT INTO DEPT (DEPTNO, DNAME, LOC)

VALUES (&COD, ’&NOMBRE’, ’&LUGAR’);

Enter value for COD: 50

Enter value for NOMBRE: PRODUCCION

Enter value for LUGAR: CALI

old 2: VALUES (&COD, ’&NOMBRE’,’&LUGAR’)

new 2: VALUES (50, ’PRODUCCION’,’CALI’)

1 row created.

SQL> SELECT * FROM DEPT WHERE LOC LIKE ’%&LUGAR%’;

Enter value for lugar: CAL

old 1: SELECT * FROM DEPT WHERE LOC LIKE ’%&LUGAR%’

new 1: SELECT * FROM DEPT WHERE LOC LIKE ’%CAL%’

DEPTNO DNAME LOC

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

50 PRODUCCION CALI

Page 11: Talleres BD1

CAPITULO 2. SQL+ Y LA CONSOLA DE COMANDOS 10

Como se puede ver, las ”variables”(o mejor, texto a reemplazar) declaradas por eloperador & son preguntadas al usuario antes de ejecutar la operacion.

Tambien es posible pasar parametros a Scripts SQL como lo muestra el siguienteejemplo:

-- SCRIPT temp.sql

INSERT INTO DEPT (DEPTNO, DNAME, LOC)

VALUES (&1, ’&2’,’&3’);

-- FIN SCRIPT

SQL> @/tmp/temp.sql 12 ADMIN BOGOTA

old 2: VALUES (&1, ’&2’,’&3’)

new 2: VALUES (12, ’ADMIN’,’BOGOTA’)

1 row created.

Los parametros en la invocacion del script son son reemplazados por las ”vari-ables”&1, &2 y &3

Page 12: Talleres BD1

Capıtulo 3

Insercion, eliminacion ymodificacion de registros

Este taller pretende que el estudiante aprenda a insertar registros en una tabla ex-istente (INSERT), eliminarlos dada una guarda (DELETE) y modificarlos (UPDATE)

3.1. INSERT

Para insertar registros en una tabla, se debe utilizar la instruccion INSERT . Porejemplo, si se van a registrar nuevos empleados en la tabla EMP , se pueden seguir lossiguientes pasos:

1. Para conocer la estructura de la tabla, se utiliza el comando DESC como semuestra a continuacion:

SQL> DESC EMP;

Name Null? Type

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

EMPNO NOT NULL NUMBER(4)

ENAME VARCHAR2(10)

JOB VARCHAR2(9)

MGR NUMBER(4)

HIREDATE DATE

SAL NUMBER(7,2)

COMM NUMBER(7,2)

DEPTNO NUMBER(2)

2. Luego se utiliza el comando INSERT :

SQL> INSERT INTO EMP

(EMPNO,ENAME,JOB,SAL,DEPTNO)

VALUES (2564,’JUAN’,’INGENIERO’,3500,10);

11

Page 13: Talleres BD1

CAPITULO 3. INSERCION, ELIMINACION Y MODIFICACION DE REGISTROS12

1 row created.

Es posible utilizar el comando INSERT sin especificar los atributos. En este caso,los valores se introduciran en los atributos en el orden que muestra el comando DESC,por ejemplo:

SQL> INSERT INTO EMP

VALUES (3654,’ANDRES’,’INGENIERO’,NULL,NULL,3800,NULL,10);

3.2. DELETE

Para eliminar registros de una tabla se utiliza el comando DELETE. Su sintaxises la siguiente:

SQL> DELETE FROM <TABLA> WHERE <CONDICION>;

Por ejemplo, para eliminar el empleado creado en la seccion anterior, se puedeejecutar:

SQL> DELETE FROM EMP WHERE EMPNO=2564;

3.3. Actualizacion

Para actualizar uno o varios atributos de un registro (o varios de ellos) en una tabla,se utiliza el comando UPDATE. Su sintaxis es la siguiente:

SQL> UPDATE <TABLA> SET <ATR1=NVALOR1,...,ATRN=NVALORN> WHERE <CONDICION>;

Por ejemplo, si se desea cambiar el departamento de trabajo del segundo empleadoque se creo (con codigo 3654) y su nombre, se puede ejecutar:

SQL> UPDATE EMP SET ENAME=’ANDRES F.’, DEPTNO=20

WHERE EMPNO=3654

3.4. Practica

1. Cree un script de insercion de datos, en el cual se creen 2 nuevos departamentosy por cada departamento 3 nuevos empleados

2. Cree un script al que se le pase como argumento los datos de un departamento ylo inserte en la tabla DEPT

Page 14: Talleres BD1

CAPITULO 3. INSERCION, ELIMINACION Y MODIFICACION DE REGISTROS13

3. Cree un script al que se le pase como argumento los datos de un empleado y loinserte en la tabla EMP

4. Elimine con una sola instruccion los dos ultimos empleados que creo (puede uti-lizar en la condicion, los operadores booleanos AND y OR)

5. Actualice todos los empleados insertados hasta el momento para que sean traslada-dos al departamento de ventas (CODIGO 30)

Page 15: Talleres BD1

Capıtulo 4

Modelado de Bases de Datos

Este taller pretende realizar un diseno de una base de datos a partir de un problemade la vida real. Adicionalmente, se pondra en practica el uso de la herramienta Designer2000 de Oracle, como soporte al modelado de sistemas de informacion.

4.1. Descripcion del problema

El problema que se desea resolver es el siguiente:El departamento de formacion de una empresa desea construir una base de datos paraplanificar y gestionar la formacion de sus empleados. La empresa organiza cursos in-ternos de formacion de los que se desea conocer el codigo, nombre, descripcion, numerode horas y costo del mismo.Los cursos pueden tener pre-requisitos obligatorios o recomendados. Un mismo cursotiene diferentes ediciones, es decir se imparte en diferentes lugares, fechas y horarios(intensivo, manana o tarde).Un curso debe estar a cargo de un empleado de la companıa. De los empleados hay quealmacenar codigo, nombre, apellido, telefono, cedula, fecha de nacimiento y sexo y paracuales cursos esta capacitado para ser docente.

4.2. Practica

4.2.1. Modelo E/R

1. Construir el modelo E/R con la notacion de Chen

2. Generar el modelo E/R con ayuda de la herramienta Designer de Oracle, teniendoen cuenta los tipos de datos y obligatoriedad de los atributos, las relaciones (sison o no debiles), etc

14

Page 16: Talleres BD1

CAPITULO 4. MODELADO DE BASES DE DATOS 15

4.2.2. DSD

A partir del modelo E/R construido, generar el esquema de tablas y editar el modeloDSD en Designer

4.2.3. Script

Generar los scripts de instalacion de la base de datos e instalarlos sobre el usuarioasignado.

Page 17: Talleres BD1

Capıtulo 5

Scripts de Tablas

Este taller pretende que el estudiante genere el modelo Relacional de un problemaa partir del modelo E/R del mismo y posteriormente genere manualmente el script deinstalacion de tablas.

5.1. Creacion de Tablas

Las sintaxis para la creacion de tablas es la siguiente:

CREATE TABLE <TABLENAME> (<LISTA ATRIBUTOS>);

Por ejemplo:

CREATE TABLE TABLA1

( CODIGO NUMBER(4),

NOMBRE VARCHAR2(50) NOT NULL,

SEXO CHAR(1) NOT NULL,

EDAD NUMBER(3) NOT NULL,

FECHA DATE DEFAULT SYSDATE

);

CREATE TABLE TABLA2

( CODIGO NUMBER(3),

TAB1_CODIGO NUMBER(4)

);

5.2. Adicion de llaves primarias

Las llaves primarias pueden ser adicionadas por medio de la siguiente sentencia:

ALTER TABLE <TABLENAME> ADD CONSTRAINT <CONSTRAINTNAME>

PRIMARY KEY(<LISTA DE ATRIBUTOS>);

16

Page 18: Talleres BD1

CAPITULO 5. SCRIPTS DE TABLAS 17

Por ejemplo:

ALTER TABLE TABLA1 ADD CONSTRAINT

TABLA1_PK PRIMARY KEY (CODIGO);

ALTER TABLE TABLA2 ADD CONSTRAINT

TABLA2_PK PRIMARY KEY (CODIGO);

5.3. Adicion de llaves foraneas

Para adicionar llaves foraneas se debe seguir la siguiente sentencia:

ALTER TABLE <TABLENAME> ADD CONSTRAINT <CONSTRAINTNAME>

FOREIGN KEY (<LISTA DE ATRIBUTOS>)

REFERENCES <TABLENAME>(<LISTA DE ATRIBUTOS>)

Por ejemplo:

ALTER TABLE TABLA2 ADD CONSTRAINT

TABLA2_TAB1_FK FOREIGN KEY (TAB1_CODIGO)

REFERENCES TABLA1 (CODIGO);

5.4. Adicion de Restricciones

5.4.1. Valor unico

ALTER TABLE TABLA1 ADD CONSTRAINT

TABLA1_NOMBRE_UK UNIQUE (NOMBRE);

5.4.2. Validaciones de Entrada

ALTER TABLE TABLA1 ADD CONSTRAINT

TABLA1_SEXO_CK CHECK

(NOMBRE IN (’F’,’M’));

ALTER TABLE TABLA1 ADD CONSTRAINT

TABLA1_EDAD_CK CHECK

(EDAD > 0 );

5.5. Practica

Construir el modelo Relacional a partir del siguiente E/R y generar el script deinstalacion de tablas para Oracle

Page 19: Talleres BD1

CAPITULO 5. SCRIPTS DE TABLAS 18

Figura 5.1: E/R Telefonıa Celular

Page 20: Talleres BD1

Capıtulo 6

Creacion de Tipos de Datos enOracle

Este taller pretende mostrar los mecanismos que ofrece Oracle para soportar lacreacion de nuevos tipos de datos (Objetos) en la base de datos

6.1. Introduccion

”Hay muchos lenguajes de programacion orientados a objetos, entre los que se in-cluyen C++ y Java. Los lenguajes de programacion de este tipo permiten definir objetosy manipularlos. Sin embargo, de lo que estan faltos es de la persistencia, la capacidadpara almacenar y recuperar objetos de forma segura y consistente. Aquı es donde entranlas bases de datos objeto relacionales como Oracle8i, la cual esta disenada para almace-nar y recuperar datos de objetos igual que sucede con los datos relacionales, utilizandoSQL como metodo estandar de comunicacion con la base de datos.” 1

6.2. Creacion de Tipos

Se pueden crear nuevos tipos en la base de datos mediante la siguiente instruccion:

CREATE OR REPLACE TYPE <NOMBRE DEL TIPO>

AS OBJECT (<ATRIBUTO1> <TIPO>,

<ATRIBUTO2> <TIPO>,

...

<ATRIBUTO> <TIPO>

);

Por ejemplo:

1Tomado de Oracle8. Programacion PL/SQL.

19

Page 21: Talleres BD1

CAPITULO 6. CREACION DE TIPOS DE DATOS EN ORACLE 20

CREATE OR REPLACE TYPE VEHICULO

AS OBJECT (PLACA VARCHAR2(6),

MOTOR VARCHAR2(15),

SERIE VARCHAR2(15),

NUMPUERTAS NUMBER(1)

);

6.3. Eliminacion de Tipos

Los tipos creados pueden ser eliminados por medio de la siguiente instruccion:

DROP TYPE <NOMBRE DEL TIPO>;

Por Ejemplo:

DROP TYPE VEHICULO;

6.4. Creacion de Tablas de Objetos

A partir de los tipos creados, se pueden especificar tablas cuyos elementos seanobjetos del tipo creado. Por ejemplo:

CREATE TABLE VEHICULOS OF VEHICULO;

Sobre estas tablas podemos ejecutar los comandos DML que hemos trabajado hastael momento. Por ejemplo:

SELECT * FROM VEHICULOS;

INSERT INTO VEHICULOS (PLACA,MOTOR,

SERIE, NUMPUERTAS)

VALUES (’ABC123’,’1A2EDS232’,

’132ASD12’,4);

6.5. Composicion de Objetos

Es posible definir tablas u objetos que contengan columnas cuyos dominios sean losnuevos tipos creados. Por ejemplo:

Page 22: Talleres BD1

CAPITULO 6. CREACION DE TIPOS DE DATOS EN ORACLE 21

CREATE TABLE TEMP(

CODIGO NUMBER,

AUTOMOVIL VEHICULO);

INSERT INTO TEMP (CODIGO, AUTOMOVIL)

VALUES (1,VEHICULO(

’ABC123’,’21SD21S’,

’ASD2SDS’,4));

SELECT * FROM TEMP;

Note que para insertar una fila en la relacion TEMP, se hace uso del constructorpor defecto de vehıculo.

6.6. Creacion de Tablas Anidadas

Se pueden crear tablas anidadas, en las cuales uno de los atributos de una tablacorresponde a una tabla (conjunto) de objetos. Por ejemplo, podemos crear gruposuniversitarios, los cuales tienen un atributo que es el conjunto de estudiantes que loconforman:

-- CREACION DEL TIPO PERSONA

CREATE OR REPLACE TYPE PERSONA

AS OBJECT(

CC VARCHAR2(10),

NOMBRE VARCHAR2(50),

NACIMIENTO DATE

)

/

-- CREACION DE UN CONJUNTO O TABLA DE PERSONAS

CREATE OR REPLACE TYPE CONJPERSONAS AS TABLE OF PERSONA

/

-- CREACION DEL TIPO DE DATOS DE LOS GRUPOS

CREATE OR REPLACE TYPE GRUPOUNIVERSITARIO AS OBJECT

(

ID VARCHAR2(3),

NOMBRE VARCHAR2(50),

INTEGRANTES CONJPERSONAS

)

/

-- CREACION DE UNA TABLA DE GRUPOSUNIVERSITARIOS

Page 23: Talleres BD1

CAPITULO 6. CREACION DE TIPOS DE DATOS EN ORACLE 22

CREATE TABLE GRUPOS OF GRUPOUNIVERSITARIO

NESTED TABLE INTEGRANTES STORE AS INTEGRANTESGRUPO

/

Como se puede observar, la tabla GRUPO tiene un atributo que es un conjunto dePERSONAS y por tanto, la base de datos requiere de una tabla para almacenar dichoconjunto.Ahora realicemos algunas operaciones sobre la nueva tabla:

INSERT INTO GRUPOS (ID,NOMBRE,INTEGRANTES)

VALUES

(

’AB’,’LOS ALFA BETA’,

CONJPERSONAS(

PERSONA(’6145687’,’CARLOS’,’14-JUN-1979’)

);

INSERT INTO GRUPOS (ID,NOMBRE,INTEGRANTES)

VALUES

(

’OR’,’LOS OMEGA RO’,

CONJPERSONAS(

PERSONA(’123456’,’ALBERTO’,’12-FEB-1979’),

PERSONA(’321532’,’ANDRES’,’20-MAR-1979’))

);

SELECT * FROM GRUPOS;

AB LOS ALFA BETA

CONJPERSONAS(PERSONA(’6145687’, ’CARLOS’, ’14-JUN-79’))

OR LOS OMEGA RO

CONJPERSONAS(PERSONA(’123456’, ’ALBERTO’, ’12-FEB-79’), PERSONA(’321532’,

’ANDRES’, ’20-MAR-79’))

-- LA TABLA ANIDAD NO PUEDE SER

-- REFERENCIADA DIRECTAMENTE

select * from INTEGRANTESGRUPO

ERROR at line 1:

ORA-22812: cannot reference nested table column’s storage table

-- ACTUALIZACION DE UN ATRIBUTO

UPDATE GRUPOS SET INTEGRANTES = CONJPERSONAS(

PERSONA(’22223’,’JUAN’,’12-FEB-1979’))

WHERE ID=’0R’;

Page 24: Talleres BD1

CAPITULO 6. CREACION DE TIPOS DE DATOS EN ORACLE 23

6.7. Operador THE

Es posible hacer referencia a los elementos de una tabla anidada a partir del operadorTHE. Por ejemplo:

SELECT NOMBRE FROM THE(SELECT INTEGRANTES FROM GRUPOS WHERE ID =’OR’)

El operador THE, toma como argumento un subquery y retorna una tabla anidadaque puede ser manipulada con instrucciones DML. Por ejemplo:

UPDATE THE(SELECT INTEGRANTES FROM GRUPOS WHERE ID =’OR’)

SET NACIMIENTO = ’01-JAN-2000’;

6.8. Referencia a Objetos

Es posible crear tipos (o tablas) que contengan referencias a objetos. Todos los ob-jetos persistentes en Oracle tienen un OID (Object Id) que es unico. Dicho identificadorpuede utilizarse como apuntador para referenciar objetos creados en otras tablas. Porejemplo, si creamos el tipo departamento y una tabla a partir de este tipo:

CREATE TYPE DEPT_TYPE AS OBJECT

(CODIGO NUMBER, NOMBRE VARCHAR2(50));

CREATE TABLE DEPARTAMENTOS OF DEPT_TYPE;

podemos definir el tipo ciudad para que contenga una referencia a un objeto tipodepartamentos:

CREATE TYPE CIUD_TYPE AS OBJECT

(CODIGO NUMBER, NOMBRE VARCHAR2(50), DEPTO REF DEPT_TYPE);

CREATE TABLE CIUDADES OF CIUD_TYPE;

Ahora, para insertar una ciudad se requiere una referencia a un departamento, porlo tanto, insertamos algunos departamentos:

INSERT INTO DEPARTAMENTOS VALUES (1,’VALLE’);

INSERT INTO DEPARTAMENTOS VALUES (2,’CAUCA’);

Page 25: Talleres BD1

CAPITULO 6. CREACION DE TIPOS DE DATOS EN ORACLE 24

Las referencias (OIDs) se puede obtener por medio de la funcion REF de la siguientemanera:

SQL> SELECT * FROM DEPARTAMENTOS;

CODIGO NOMBRE

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

1 VALLE

2 CAUCA

SQL> SELECT REF(D) FROM DEPARTAMENTOS D

REF(D)

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

0000280209EE08C8BADD9B40A4E030A8C00D6403D8EE08C8BADD9340A4

E030A8C00D6403D800C000120000

0000280209EE08C8BADD9C40A4E030A8C00D6403D8EE08C8BADD9340A4

E030A8C00D6403D800C000120001

Para insertar una ciudad se debe utilizar las referencias de los departamentos yacreados. En SQL es posible realizar inserciones a partir de una consulta (query) de lasiguiente manera:

INSERT INTO TABLE (SELECT ... FROM ... WHERE ...);

para este caso partircular, la insercion quedarıa de la siguiente manera:

INSERT INTO CIUDADES (SELECT 1,’CALI’,REF(D)

FROM DEPARTAMENTOS D WHERE CODIGO=1);

INSERT INTO CIUDADES (SELECT 2, ’POPAYAN’ ,REF(D)

FROM DEPARTAMENTOS D WHERE CODIGO=2);

Si se realiza una consulta sobre las ciudades, obtenemos las referencias de los de-partamentos:

SQL> SELECT * FROM CIUDADES;

CODIGO NOMBRE DEPTO

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

1 CALI 0000220208EE08C8BADD9B40A4E030A8C00D

6403D8EE08C8BADD9340A4E030A8C00D6403D8

2 POPAYAN 0000220208EE08C8BADD9C40A4E030A8C00D64

03D8EE08C8BADD9340A4E030A8C00D6403D8

Para obtener el departamento referenciado se utiliza la funcion DEREF :

Page 26: Talleres BD1

CAPITULO 6. CREACION DE TIPOS DE DATOS EN ORACLE 25

SQL> SELECT NOMBRE, DEREF(DEPTO) FROM CIUDADES

NOMBRE

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

DEREF(DEPTO)(CODIGO, NOMBRE)

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

CALI

DEPT_TYPE(1, ’VALLE’)

POPAYAN

DEPT_TYPE(2, ’CAUCA’)

6.9. Practica

Modelar el siguiente problema en ODL y generar el script de tipos , tablas y datosbasicosSe desea mantener la informacion de una empresa de reparacion de computadores. Decada PC se almacena su marca, dueno y fecha de recepcion. Adicionalmente, se adjuntauna lista con sus partes mas importantes y la cantidad y unidad de las mismas, porejemplo, Procesador 466 Mhz, Memoria 8 MB, Disco Duro 40 GB, etc. Adicionalmentese registra los procedimientos realizados por cada uno de los tecnicos por los que pasa elequipo. Por ejemplo, El empleado X lo destapo, X reviso la fuente, Y reparo la tarjetade vıdeo, etc.

Page 27: Talleres BD1

Capıtulo 7

Introduccion a PL/SQL y Cursores

Este taller pretende introducir al estudiante en el manejo de PL/SQL ası como lautilizacion de cursores para su posterior uso en funciones, procedimientos, triggers, etc

7.1. Bloques en PL/SQL

Los bloques en PL/SQL se componen de las siguientes secciones:

DECLARE

<DECLARACION DE VARIABLES Y CURSORES>

BEGIN

<SENTENCIAS>

EXCEPTION

<MANEJO DE ERRORES>

END;

.

Tenga en cuenta que debe terminar el bloque con punto (.) y luego ejecutarlo con slash(/).

7.2. Estructuras de Control

Al igual que en cualquier lenguaje de programacion, PL/SQL cuanta con estructurasde control, las cuales se describen a continuacion:

7.2.1. Condicional

IF (<CONDICION>) THEN

<SENTENCIAS>

ELSE

<SENTENCIAS>

26

Page 28: Talleres BD1

CAPITULO 7. INTRODUCCION A PL/SQL Y CURSORES 27

END IF;

7.2.2. Ciclos

LOOP

<SENTENCIAS>

END LOOP;

While

WHILE <CONDICION> LOOP

<SENTENCIAS>

END LOOP;

FOR

FOR <VARIABLE> IN <RANGO> LOOP

<SENTENCIAS>

END LOOP;

El siguiente bloque de codigo imprime los numeros del 1 al 5 haciendo uso de lostres tipos de ciclos:

declare

I number;

begin

-- FOR

for i in 1..5 loop

dbms_output.put_line(to_char(i));

end loop;

-- WHILE

I:=1;

while I<=5 loop

dbms_output.put_line(to_char(i));

i:= i+1;

end loop;

-- LOOP

i:=1;

loop

if i>5 then

exit ;

end if;

Page 29: Talleres BD1

CAPITULO 7. INTRODUCCION A PL/SQL Y CURSORES 28

dbms_output.put_line(to_char(i));

i:= i+1;

end loop;

end;

/

El paquete dbmsoutput permite realizar salidas de texto en la consola. Para que

tenga efecto, se debe informar a la misma que las salidas de texto deben ser tomadasen cuenta mediante el siguiente comando:

SET SERVEROUTPUT ON;

Si se van a desplegar mensajes de texto relativamente grandes (que superen los 255bytes con los que cuenta por defecto el buffer), se debe ampliar el tamano destinadopara el almacenamiento del mismo de la siguiente forma:

SET SERVEROUTPUT ON SIZE X;

donde X es el nuevo tamano en bytes del buffer.

7.3. Tipos

Es posible declarar nuevos tipos en los procedimientos PL/SQL. Por ejemplo, sepueden crear registro (como las estructuras en C/C++) como se describe a continuacion:

7.3.1. Registros (Estructuras)

Se pueden crear estructuras de la siguiente forma:

TYPE <NOMBRE> IS RECORD(

<LISTA DE ATRIBUTOS>

);

O se puede hacer uso del atributo ROWTYPE

<VARIABLE> <TABLA>%ROWTYPE;

En este caso la variable es un registro del tipo de la tabla.

Page 30: Talleres BD1

CAPITULO 7. INTRODUCCION A PL/SQL Y CURSORES 29

7.4. Cursores

Los cursores son apuntadores al area de contexto donde Oracle almacena o manipulalos resultados de las consultas. Por medio de ellos, se pueden hacer recorridos sobre lastablas o consultas registro por registro.A continuacion se presenta un ejemplo:

-- CALCULO DE UNA NOMINA SENCILLA

-- POR CARLOS ALBERTO OLARTE

-- PONTIFICIA UNIVERSIDAD JAVERIANA

-- OCTUBRE 2002

DECLARE

P_PENSION NUMBER;

SALUD NUMBER;

P_FONDO NUMBER;

CODEMP NUMBER;

SALARIO NUMBER;

DESCUENTOS NUMBER;

FONDO VARCHAR2(1);

CURSOR EMP IS SELECT CODIGO,BASICO,FONDO FROM EMPLEADOS;

BEGIN

-- ABRIR EL CURSOR

OPEN EMP;

-- SELECCION DE LOS PORCENTAJES

SELECT PENSION,FONDO INTO P_PENSION, P_FONDO

FROM PORCENTAJES;

-- ELIMINACION DE LOS DATOS DE LA NOMINA

DELETE FROM NOMINA;

LOOP

FETCH EMP INTO CODEMP,SALARIO,FONDO;

IF (EMP%NOTFOUND) THEN

EXIT;

END IF;

DESCUENTOS := 0;

IF (FONDO = ’S’) THEN

DESCUENTOS := DESCUENTOS + P_FONDO * SALARIO/100;

END IF;

DESCUENTOS := DESCUENTOS + P_PENSION * SALARIO/100;

-- INSERCION EN LA TABLA NOMINA

Page 31: Talleres BD1

CAPITULO 7. INTRODUCCION A PL/SQL Y CURSORES 30

INSERT INTO NOMINA (EMP_CODIGO, PERIODO, SUBTOTAL, DESCUENTOS)

VALUES (CODEMP, SYSDATE,SALARIO, DESCUENTOS);

END LOOP;

CLOSE EMP;

COMMIT;

END ;

7.4.1. Cursores Parametrizables

Se pueden declarar cursores con argumentos o a partir de variables de bloque:

DECLARE

CODIGO NUMBER;

CURSOR C_1 IS SELECT *

FROM TABLA

WHERE COD = CODIGO;

BEGIN

CODIGO = 4;

OPEN C_1;

<SENTENCIAS>

CLOSE C_1;

END;

O de otra forma:

DECLARE

CODIGO NUMBER;

CURSOR C_1(CODIGO NUMBER) IS

SELECT *

FROM TABLA

WHERE COD = CODIGO;

BEGIN

OPEN C_1(5);

<SENTENCIAS>

CLOSE C_1;

END;

Page 32: Talleres BD1

CAPITULO 7. INTRODUCCION A PL/SQL Y CURSORES 31

7.5. Practica

Realice un procedimiento anonimo en PL/SQL que calcule la nomina para las tablasEMP y DEPT. Tenga en cuenta el calculo de pensiones y cesantıas (un porcentaje fijosobre el salario base). Si la nomina es de Junio o Diciembre adicionar la prima (mitaddel salario). Si el empleado pertenece al departamento de ventas (SALES) debe darseuna bonificacion del 15%.

Page 33: Talleres BD1

Capıtulo 8

Funciones y Procedimientos enPL/SQL

Este taller pretende que el estudiante pase de los bloques anonimos PL/SQL escritoscon anterioridad a bloques PL/SQL almacenados en la base de datos bien sea comofunciones o como procedimientos.

8.1. Creacion de un Procedimiento

Los procedimiento en PL/SQL son creados de la siguiente forma:

CREATE [OR REPLACE] PROCEDURE <PROCEDIMIENTO>

[<argumento> [IN|OUT|IN OUT] tipo],

[<argumento> [IN|OUT|IN OUT] tipo],

... IS|AS

<CUERPO>

Con esta sentencia, el procedimiento es creado y ALMACENADO en la base dedatos, para que despues pueda ser utilizado.

8.1.1. Or Replace

Esta parte de la sentencia puede ser utilizada para borrar el procedimiento existentecon el mismo nombre, y crear uno nuevo (util en fase de desarrollo).

8.1.2. Argumentos

Los argumentos en los procedimiento PL/SQL pueden ser de 3 modos diferentes:

32

Page 34: Talleres BD1

CAPITULO 8. FUNCIONES Y PROCEDIMIENTOS EN PL/SQL 33

Modo DescripcionIN Solo el valor del parametro es pasado al procedimiento,

es decir, que no es posible realizar modificaciones sobreel mismo.

OUT El valor del argumento es ignorado al ser pasado al pro-cedimiento (argumento de solo escritura). Las modifi-caciones de su valor dentro del procedimiento se venreflejados despues de terminar el mismo.

IN OUT Es la combinacion de los modos anteriores. En este caso,el parametro puede ser leıdo o escrito dentro del pro-cedimiento, y su valor cambiara despues de terminar elprocedimiento.

Los argumentos no pueden tener precision numerica ni longitud. Por ejemplo, los argu-mento varchar2(20) o number(7,2) no son validos.

Paso de parametros

El paso de los parametros de puede realizar de forma posicional o nominal. En elprimer caso (como en todos los lenguajes de programacion), el i-esimo valor suministra-do al procedimiento, corresponde al i-esimo argumento en la declaracion.Por otro lado, es posible hacer el paso de los parametros a un procedimiento en unorden diferente al de la declaracion, haciendo uso de la forma nominal como se muestraen el siguiente ejemplo:

CREATE OR REPLACE PROCEDURE XYZ

(CODIGO NUMBER, NOMBRE VARCHAR2)

BEGIN

....

END;

-- PROCEDIMIENTO QUE HACE EL LLAMADO

DECLARE

COD NUMBER;

NOM VARCHAR2(50);

BEGIN

XYZ(COD,NOM); --FORMA POSICIONAL

XYZ(

CODIGO => COD,

NOMBRE => NOM); -- FORMA NOMINAL

...

END;

Page 35: Talleres BD1

CAPITULO 8. FUNCIONES Y PROCEDIMIENTOS EN PL/SQL 34

Valores por defecto

Es posible como en C++ tener valores por defecto en los parametros de los proced-imientos en PL/SQL. La manera de especificar dicho valor es la siguiente:

CREATE OR REPLACE PROCEDURE XYZ

( COD IN NUMBER DEFAULT 5) IS

...

END;

O

CREATE OR REPLACE PROCEDURE XYZ

( COD IN NUMBER := 5) IS

...

END;

8.1.3. Ejemplo 1

El siguiente procedimiento almacena en el parametro SAL el salario del empleadocuyo codigo es pasado como parametro.

CREATE OR REPLACE PROCEDURE GETSALARIO

(CODIGO IN NUMBER, SALARIO IN OUT NUMBER)

IS

BEGIN

SELECT SAL INTO SALARIO

FROM EMP

WHERE EMPNO = CODIGO;

EXCEPTION

WHEN NO_DATA_FOUND THEN

SALARIO := 0;

END GETSALARIO;

Y el siguiente procedimiento hace un llamado al procedimiento anterior:

declare

cod number;

sal number;

begin

cod := 7369;

getsalario(cod,sal);

dbms_output.put_line(to_char(sal));

end;

Page 36: Talleres BD1

CAPITULO 8. FUNCIONES Y PROCEDIMIENTOS EN PL/SQL 35

8.1.4. Eliminacion de Procedimientos

Los procedimiento pueden ser eliminados de la base de datos de la siguiente forma:

DROP PROCEDURE <PROCEDIMIENTO>;

8.2. Funciones

Las funciones son similares a los procedimiento, con la caracterıstica adicional queson capaces de retornar un valor. La sintaxis para la creacion de las mismas es lasiguiente:

CREATE OR REPLACE FUNCTION XYZ

(<ARGUMENTO>)

RETURN <TIPO>

IS

BEGIN

....

RETURN <VALOR>;

END;

8.2.1. Ejemplo 2

La siguiente funcion retorna el numero de empleados que pertenecen al departamen-to que se pasa como argumento:

CREATE OR REPLACE FUNCTION NUMEMP

(DEPARTAMENTO IN NUMBER)

RETURN NUMBER IS

RETORNO NUMBER;

RETORNO2 NUMBER;

BEGIN

SELECT COUNT(*) INTO RETORNO

FROM EMP

WHERE DEPTNO = DEPARTAMENTO;

RETURN RETORNO;

END NUMEMP;

Y a continuacion se muestra una ejecucion de la misma

SQL> SELECT NUMEMP(20) FROM DUAL;

Page 37: Talleres BD1

CAPITULO 8. FUNCIONES Y PROCEDIMIENTOS EN PL/SQL 36

NUMEMP(20)

----------

5

En este caso se esta haciendo uso de la funcion desde una terminal SQL+, pero puedenser invocadas dentro de otras funciones o procedimientos o en expresiones DML. Porejemplo:

SQL> select DEPTNO,numemp(DEPTNO) from dept;

DEPTNO NUMEMP(DEPTNO)

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

10 3

20 5

30 6

8.3. Diccionario de Datos

Algunas tablas del usuario son utiles para conocer informacion sobre las tablas,procedimiento, objetos, etc que se han creado.En clase se ha visto el uso de la tabla USER TABLES para conocer las tablas que

se han creado en el usuario. Para la manipulacion de las funciones y procedimiento setienen las siguientes tablas y comandos para administrarlos:

Tabla/Comando DescripcionSHOW ERROR Muestra los errores de compilacion cuando se crea un proced-

imiento o funcionUSER OBJECTS Contiene la informacion de todos los objetos del usuario alma-

cenados en la base de datos (Indices, Tablas, Tipos, Proced-imiento, etc). SELECT OBJECT NAME,OBJECT TYPE,STATUS FROM user objects;

USER ERRORS Contiene los errores generados al tratar de almacenar un pro-cedimiento o funcion.

8.4. Practica

Los siguientes ejercicios hacen referencia a las tablas EMP y DEPT

1. Implemente una funcion que retorne el saldo de un empleado dado su codigo

2. Implemente una funcion que retorne el total de salarios dado el numero de undepartamento (utilice cursores en vez de funciones de agrupamiento)

Page 38: Talleres BD1

CAPITULO 8. FUNCIONES Y PROCEDIMIENTOS EN PL/SQL 37

3. Implemente un procedimiento que dado el codigo de un empleado, inserte en unatabla todos sus companeros de departamento (sin incluirlo)

4. Escriba un procedimiento que dado el numero del departamento, retorne el salariomaximo, mınimo y el promedio

Page 39: Talleres BD1

Capıtulo 9

Paquetes en PL/SQL

El objetivo de este taller, es crear Tipos Abstractos de Datos TADs en una base dedatos con ayuda de paquetes que encapsulan y agrupan metodos, propiedades y tipos.

9.1. Introduccion

Un paquete es una estructura en PL/SQL que permite almacenar juntos una seriede objetos, funciones variables, declaraciones, etcEl paquete se compone de una especificacion (como el .h en C/C++) donde se encuen-tran la declaracion de tipo, variables globales y los prototipos de las funciones ; y deun cuerpo (.c o .cpp) donde se implementan las funciones.

9.2. Especificacion de un Paquete

A continuacion se muestra la sintaxis para la especificacion de un paquete:

CREATE [OR REPLACE] PACKAGE <PAQUETE> [IS|AS]

<PROCEDIMIENTO>|

<FUNCION>|

<DECLARACION DE VARIABLE>|

<DEFINICION DE TIPO>|

<DECLARACION DE CURSOR>

END;

como se puede observar es posible definir dentro de la cabecera del paquete funciones,procedimientos, nuevos tipos, definir variables globales o declarar cursores

9.2.1. Sobrecarga de funciones

Al igual que en Java o C++, es posible realizar sobrecarga de procedimientos enPL/SQL. Se pueden nombrar dos funciones o procedimientos igual, pero el tipo de losargumentos debe ser diferente.

38

Page 40: Talleres BD1

CAPITULO 9. PAQUETES EN PL/SQL 39

No es permitido solo variar el modo del parametro (IN, OUT, IN OUT) o cambiar eltipo de parametro de char a varchar. Tampoco es valido solo cambiar el tipo de retorno.

9.3. Cuerpo del Paquete

Antes de compilar el cuerpo del paquete es necesario que la cabecera se haya compi-lado exitosamente. A continuacion se muestra un ejemplo de como declarar un cuerpode un paquete:

CREATE OR REPLACE PACKAGE BODY <PAQUETE> AS

<IMPLEMENTACION DE PROCEDIMIENTOS>

END;

9.4. Invocacion de los elementos de los paquetes

Los elementos de los paquetes, bien sean tipos, funciones, variables, etc, se puedenacceder mediante el nombre del paquete, el signo punto (.) y el nombre del elementocomo se muestra en el siguiente ejemplo:

BEGIN

--Invocacion de un procedimiento

Paquete1.Proc1(a,1);

-- Invocacion de una funcion

X = Paquete1.sum(1,2);

-- Uso de una variable

y = Paquete1.var1;

-- Uso de un tipo

VarX Paquete1.t_tipo1;

9.5. Inicializacion de un Paquete

Al igual que los constructores en los lenguajes de programacion orientados por ob-jetos, es posible definir dentro del cuerpo del paquete una serie de instrucciones para lainicializacion de las variables. Dicha inicializacion se debe realizar dentro de un cuerpobegin, end; como se muestra a continuacion:

CREATE OR REPLACE PACKAGE BODY PK1 AS

<PROC1>

<PROC2>

<FUNC1>

-- INICIALICACION

BEGIN

-- INCIIALIZACION DE UNA VARIABLE

VAR1= 5;

Page 41: Talleres BD1

CAPITULO 9. PAQUETES EN PL/SQL 40

-- LLAMADO A UNA FUNCION DE INICIALIZACION

F_INIC();

END PK1;

9.6. Ejemplo

A continuacion se muestra un ejemplo de un paquete para encapsular el tipo de datosempleado. El script crea la tabla y provee un paquete para adicionarlos , consultar unodado el codigo y retornar el numero total de empleados registrados. Al final del scriptse encuentran unas pruebas sobre el paquete:

-- CREACION DEL PAQUETE EMPLEADO

-- CARLOS OLARTE

-- PONTIFICIA UNIVERSIDAD JAVERIANA

-- ABRIL 2003

SPOOL EMP.sql

PROMPT ELIMINANDO LA TABLA EMPLEADOS....

DROP TABLE EMPLEADOS;

PROMPT CREANDO LA TABLA EMPLEADOS....

CREATE TABLE EMPLEADOS

( CODIGO NUMBER PRIMARY KEY,

NOMBRE VARCHAR2(50) NOT NULL);

PROMPT ...CREANDO CABECERA DEL PAQUETE

CREATE OR REPLACE PACKAGE EMPLEADO IS

TYPE T_EMP IS RECORD(CODIGO NUMBER, NOMBRE VARCHAR2(50)); -- TIPO DE DATO

PROCEDURE CREAR (C IN NUMBER, N IN VARCHAR2) ; -- CREACION(INSERCION) DE UN EMP

FUNCTION TOTAL RETURN NUMBER; -- RETORNAR EL TOTAL DE EMPLEADOS

FUNCTION GET(COD IN NUMBER) RETURN T_EMP; -- OBTIENE EL EMPLEADOS DE LA TABLA

CURSOR C_EMP IS SELECT CODIGO,NOMBRE FROM EMPLEADOS; --CURSOR PARA RECORRER LA TABLA

UNA_CONSTANTE NUMBER; --CONSTANTE DE PRUEBA

END;

/

PROMPT ....CREANDO CUERPO DEL PAQUETE

CREATE OR REPLACE PACKAGE BODY EMPLEADO IS

-- *****************************************************

PROCEDURE CREAR (C IN NUMBER, N IN VARCHAR2) IS

BEGIN

INSERT INTO EMPLEADOS(CODIGO,NOMBRE)

Page 42: Talleres BD1

CAPITULO 9. PAQUETES EN PL/SQL 41

VALUES (C,N);

END CREAR;

-- *****************************************************

-- *****************************************************

FUNCTION TOTAL RETURN NUMBER IS

RES NUMBER;

BEGIN

SELECT COUNT(*)

INTO RES

FROM EMPLEADOS;

RETURN RES;

END TOTAL;

-- *****************************************************

-- *****************************************************

FUNCTION GET (COD IN NUMBER) RETURN T_EMP is

RES T_EMP;

BEGIN

SELECT CODIGO,NOMBRE INTO RES

FROM EMPLEADOS

WHERE CODIGO = COD;

RETURN RES;

END GET;

-- *****************************************************

-- *****************************************************

-- INICIALIZACION DEL PAQUETE

BEGIN

UNA_CONSTANTE:=4;

END;

/

PROMP ... CORRIENDO UNA PRUEBA

-- HABILITAR LA SALIDA POR CONSOLA

SET SERVEROUTPUT ON

-- BLOQUE PL/SQL ANONIMO CON ALGUNAS PRUEBAS

DECLARE

-- VARIABLES LOCALES

EMPTEMP EMPLEADO.T_EMP;

TOTAL NUMBER;

Page 43: Talleres BD1

CAPITULO 9. PAQUETES EN PL/SQL 42

BEGIN

DBMS_OUTPUT.PUT_LINE (’UTILIZANDO LA FUNCION DE CREACION’);

EMPLEADO.CREAR(1,’CARLOS’);

EMPLEADO.CREAR(2,’JUAN’);

EMPLEADO.CREAR(3,’FELIPE’);

EMPLEADO.CREAR(4,’ANDRES’);

TOTAL := EMPLEADO.TOTAL();

DBMS_OUTPUT.PUT_LINE (’TOTAL EMPLEADOS: ’ || to_char(TOTAL));

DBMS_OUTPUT.PUT_LINE (’OBTENCION DEL EMPLEADO COD=3’);

EMPTEMP := EMPLEADO.GET(3);

DBMS_OUTPUT.PUT_LINE (’NOMBRE= ’ || EMPTEMP.NOMBRE);

END;

/

SPOOL OFF

9.7. Practica

Defina un paquete llamado Complejo, que implemente la siguiente especificacion:TiposSe debe crear un nuevo tipo llamado t complejo que es una estructura que contiene dosreales (la parte real y la parte imaginaria).Luego se debe crear en SQL una tabla llamada COMPLEJOS que cuente con doscolumnas: Real y Complejo.Constantes Se debe declarar la constante C CERO que debe ser el complejo cero(0+0i).Nota:Las constantes en PL/SQL pueden ser declaradas de la siguiente forma:

X CONSTANT NUMBER := 5;

Y CONSTANT VARCHAR := ’HOLA MUNDO’;

Cursores Se debe declarar un cursor C COMPLEJO que capture SELECT * FROMCOMPLEJOS;FuncionesSe deben implementar las siguientes funciones dentro del paquete:

Dado dos reales retornar una variable de tipo t complejo inicializada

Dados dos complejos retornar su suma

Dados dos complejos retornar su multiplicacion

Dado un complejo retornar su string de la forma x+yi

Page 44: Talleres BD1

CAPITULO 9. PAQUETES EN PL/SQL 43

Dado un complejo, retornar su parte real

Dado un complejo, retornar su parte imaginaria

Procedimientos

Dados dos complejos, almacenar en el tercer argumento su suma

Dado un complejo, insertarlo en la tabla COMPLEJOS creada con anterioridad

Dado un Entero i, almacenar en el segundo argumento (tipo t complejo) el i-esimocomplejo de la tabla (hacer uso del cursor definido con anterioridad)

Page 45: Talleres BD1

Capıtulo 10

Triggers (Disparadores)

Para imponer algo de dinamica a la base de datos, es posible definir procedimientosque se lanzan cuando cierto evento evento sucede (insercion, eliminacion, actualizacion,etc). Este taller pretende que el estudiante adquiera habilidad en la creacion de triggerssobre la base de datos.

10.1. Introduccion

Un disparador es un procedimiento PL/SQL almacenado en la base de datos, quese activa (o ejecuta) cuando se realiza una operacion de DML (insert, delete o update)sobre una tabla especıfica.Los disparadores son utiles para:

El mantenimiento de restricciones de integridad complejas (restricciones sobrevarias tablas o sobre totales de una tabla, etc)

Auditar una tabla, registrando los cambios sobre la misma

Informar automaticamente a otros programas sobre cambios realizados sobre latabla.

10.2. Creacion de Triggers

A continuacion se presenta la sintaxis para la creacion de Triggers:

CREATE [OR REPLACE] TRIGGER <NOMBRE_TRIGGER>

<BEFORE|AFTER> <SUCESO> ON <TABLA>

[FOR EACH ROW [WHEN <CONDICION>]]

<SENTENCIAS>;

El encabezado de la instruccion es similar a los otros bloques PL/SQL, donde se nom-bra el procedimiento, funcion , paquete, etc. La composicion <BEFORE—AFTER>

<SUCESO> corresponde a cuando se debe activar el trigger: por ejemplo, es posible

44

Page 46: Talleres BD1

CAPITULO 10. TRIGGERS (DISPARADORES) 45

definir que se dispare el procedimiento antes de insertar en la tabla indicada (BEFOREINSERT ) o despues de que se elimine un registro (AFTER DELETE ). Finalmente,la sentencia FOR EACH ROW[WHEN <CONDICION>] indica si se debe lanzar eltrigger por cada una de las filas afectadas o solamente una vez por toda la operacion;la clausula WHEN seleccionarıa solo las filas afectadas que cumplan con la condicion.Por lo anterior, podemos extraer la siguiente tabla con los tipos de triggers:

Categorıa Valores ComentariosOrden Insert, Delete, Update Define que tipo de orden DML provoca

la activacion del trigger.Temporizacion Before o After Define si el disparador se ejecuta antes

o despues de la orden.Nivel Fila y Orden Define si el trigger deben ejecutarse por

cada fila afectada (FOR EACH ROW )o una sola vez por todas ellas.

10.3. Restricciones de los disparadores

Las siguientes acciones no son permitidas en el cuerpo del disparador:

Realizar un COMMIT o ROLL BACK puesto que la ejecucion del trigger haceparte de la transaccion que lo disparo.

Por la razon anterior, no es posible hacer llamados a funciones y/o procedimientosdentro del cuerpo del trigger que realicen commit o roll back.

No puede afectar filas de la tabla que activo el trigger (problema de la tablamutante)

10.4. Eliminacion y desactivacion de triggers

Los triggers pueden eliminarse de la base de datos con la siguiente instruccion:

DROP TRIGGER <NOMBRE TRIGGER>;

Adicionalmente, los triggers pueden ser habilitados o deshabilitados con la siguienteinstruccion:

ALTER TRIGGER <NOMBRE TRIGGER> {DISABLE|ENABLE};

Un trigger deshabilitado no es eliminado de la base de datos, pero no se ejecutara cuandosuceda el evento sobre la tabla que se definio.

Page 47: Talleres BD1

CAPITULO 10. TRIGGERS (DISPARADORES) 46

10.5. Ejemplo

A continuacion se muestra la utilizacion de un trigger:

-- CREACION DE LAS TABLAS NECESARIAS

CREATE TABLE TABLA1 (

CODIGO NUMBER PRIMARY KEY,

NOMBRE VARCHAR2(50));

CREATE TABLE AUDITORIA

(FECHA DATE, TAB1_CODIGO NUMBER,

OPERACION VARCHAR(1));

ALTER TABLE AUDITORIA

ADD CONSTRAINT OPE_CK

CHECK (OPERACION IN (’D’,’U’));

-- CREACION DEL TRIGGER

CREATE OR REPLACE TRIGGER AUDIT_TABLA1

BEFORE DELETE OR UPDATE ON TABLA1

FOR EACH ROW

DECLARE

TEMP VARCHAR(1);

BEGIN

IF DELETING THEN

TEMP := ’D’;

ELSE

TEMP := ’U’;

END IF;

INSERT INTO AUDITORIA (FECHA, TAB1_CODIGO,OPERACION)

VALUES (SYSDATE, :OLD.CODIGO, TEMP);

END;

.

/

En el trigger anterior, se pueden destacar dos aspectos adicionales: El predicado DELET-ING y la pseudo-variable OLD que se explican a continuacion:

10.5.1. Predicados de los disparadores

Existen tres predicados en los disparadores, que determinan el tipo de operacionDML que se realizo sobre la tabla. Estos predicados son los siguientes:

INSERTING Es verdadero cuando la operacion es de insercion

DELETING Es verdadero cuando la operacion es de eliminacion

UPDATING Es verdadero cuando la operacion es de actualizacion

Page 48: Talleres BD1

CAPITULO 10. TRIGGERS (DISPARADORES) 47

10.5.2. Pseudo-Variables :NEW y :OLD

Las pseudo-variables :NEW y :OLD estan disponibles para los triggers a nivel de file(FOR EACH ROW). Estas variables son de tipo registro y contienen los atributos dela fila que se esta afectando por la instruccion DML. Como en el caso de los registros,sus atributos se pueden acceder a traves del operador punto, pero no es legal hacerasignaciones con una variable el tipo TABLA%ROWTYPE. A continuacion se presentauna tabla con los posibles valores de :NEW y :OLD.

Orden DML :OLD :NEWINSERT No definido. Todos sus atributos

son NULLValores que seran insertadoscuando se complete la orden

UPDATE Valores originales de la fila antesde la actualizacion

Nuevos valores que seran escritoscuando se complete la orden

DELETE Valores originales antes de serborrada la fila

No definido. Todos sus atributosson NULL

10.6. Practica

1. Cree las siguientes tablas:

PRODUCTOS (CODIGO,NOMBRE,CANTIDAD);

FACTURAS (NUMERO, FECHA, VALOR, DESPACHADA, ANULADA);

DETALLESFACTURA (PRO_CODIGO,FAC_NUMERO, CANTIDAD, UNITARIO);

2. Cree un trigger que actualice el valor de la factura cada que se adicione, elimineo actualice uno de sus detalles.

3. Cree un trigger que actualice la cantidad de los productos, cuando se despacheuna factura

4. Cree un trigger que restaure el inventario si la factura fue despachada y luegoanulada.

Page 49: Talleres BD1

Capıtulo 11

Manejo de Errores

Cuando se escriben bloques PL/SQL es posible encontrar dos tipos de errores: Er-rores en tiempo de compilacion y errores en tiempo de ejecucion. En el primer caso,antes de almacenar o ejecutar el procedimiento el compilador chequea que no existaningun error de este tipo (por ejemplo variables no declaradas, errores de sintaxis, etc).En el segundo caso, queda a tarea del programador brindar el soporte necesario paraque los programas no se aborten anormalmente. Ejemplo de este tipo de errores, es laviolacion de restricciones de la base de datos, encontrar menos o mas de un registro enuna instruccion select x into y from ..., etc. 1

11.1. Declaracion de Excepciones

Al igual que en Java o C++, es posible declarar excepciones en PL/SQL. A contin-uacion se muestra la declaracion de una excepcion:

DECLARE

USER_EXCEPTION EXCEPTION;

ERROR1_EXC EXCEPTION;

Es posible definir valore numericos y mensajes explicativos a las excepciones lan-zadas de la siguiente forma:

BEGIN

RAISE_APPLICATION_ERROR(<NUMERO>,<MENSAJE>);

Donde NUMERO es el codigo del error (entre -20000 y -20999) y MENSAJE es elmensaje de error. Por ejemplo, si se quiere validar que la factura no exceda $1.000.000,se puede crear un trigger que lanza un error de aplicacion ası:

CREATE TRIGGER .....

DECLARE

TOT NUMBER;

1Tomado de Oracle8 Programacion en PL/SQL

48

Page 50: Talleres BD1

CAPITULO 11. MANEJO DE ERRORES 49

BEGIN

SELECT TOTAL INTO TOT

FROM FACTURAS

WHERE NUMERO = :NEW.FACT_NUMERO;

IF (:NEW.VALOR + TOT > 1000000) THEN

RAISE_APPLICATION_ERROR(

-20000,’No se pueden adicionar elementos a ’

|| to_char(:NEW.FACT_NUMERO));

END IF;

END;

11.1.1. Excepciones predefinidas en Oracle

En Oracle existe una serie de Excepciones predefinidas que se encuentran en lasiguiente tabla:

Error Excepcion Descripcion

ORA-0001 DUP VAL ON INDEX Violacion de una restriccion deunicidad

ORA-0051 TIMEOUT RESOURCE Se produjo un fin de intervalomientras se esperaba cierto recur-so

ORA-1001 INVALID CURSOR Operacion ilegal sobre un cursorORA-1012 NOT LOGGED ON No existe conexion con OracleORA-1017 LOGIN DENIED Nombre de usuario o contrasena

invalidosORA-1403 NO DATA FOUND No se ha encontrado ningun datoORA-1422 TOO MANY ROOMS Mas de una fila en una instruccion

Select.. Into..ORA-1476 ZERO DIVIDE Division por ceroORA-1722 INVALID NUMBER Error en conversion numericaORA-6502 VALUE ERROR Error de truncamiento aritmeticoORA-6504 ROWTYPE MISTACH Columnas incompatibles entre un

cursor y las variables localesORA-6511 CURSOR ALREADY OPENEl cursor ya fue abiertoORA-6530 ACCESS INTO NULL Asignacion de valores a un objeto

nulo

11.2. Captura de Excepciones

Dentro de un bloque PL/SQL es posible capturar excepciones de la siguiente manera:

DELCARE

Page 51: Talleres BD1

CAPITULO 11. MANEJO DE ERRORES 50

...

BEGIN

...

EXCEPTION

WHEN <EXCEPCION> THEN

<SENTENCIAS>

WHEN <EXCEPCION1> OR <EXPCION2> THEN

<SENTENCIAS>

WHEN OTHERS THEN

<SENTENCIAS>

Como se puede observar, la captura de excepciones se hace dentro de la etiquetaEXCEPTION. El gestor de Excepciones OTHERS puede ser utilizado para capturarcualquier excepcion.

11.3. Lanzamiento de Excepciones

Es posible lanzar excepciones propios de Oracle o definidas por el usuario de lasiguiente manera:

RAISE <EXCEPCION>;

A similitud de la instruccion throw en Java.

11.4. SQLERRM, SQLCODE

Las funciones predefinidas SQLERRM y SQLCODE proporcionan informacion delerror actual generado. La primera retorna una valor numerico que representa el error(ver Oracle8 Error Messages) y la segunda el texto del error.Por ejemplo:

DELCARE

errtxt varchar2(100);

errcod number;

BEGIN

...

EXCEPCION

WHEN OTHERS THEN

errcod := SQLCODE;

errtxt := substr(SQLERRM,1,100);

dbms_output.put_line(’Error : ’ || to_char(errcod) || ’. ’ ||

errtxt;

END;

Page 52: Talleres BD1

CAPITULO 11. MANEJO DE ERRORES 51

11.5. Ambito de las Excepciones

Al igual que en Java, las excepciones en PL/SQL son capturadas por la seccionEXCEPTION que se encuentra al mismo nivel donde sucedio el error. En caso que nose tenga la captura de dicha excepcion, el control del programa pasa al ambito superioren el que se encontraba dicho codigo, por ejemplo el procedimiento que invoco la funciono procedimiento con error, o la consola SQL que invoco inicialmente el procedimiento.Por lo anterior, es buena tecnica de programacion, proveer una gestor OTHERS en elnivel superior del programa.

11.6. Practicas

1. Cree una funcion division que lance una excepcion de usuario cuando el divisorsea cero

2. Cree una funcion que retorne el sueldo de un empleado (Tabla EMP) dado elcodigo, y lance una excepcion en caso que el codigo no exista

3. Cree las tablas Estudiante(codigo,nombre), cursos(codigo, cur codigo,nombre) ymatrıcula (est codigo, cur codigo, nota, periodo) , y verifique mediante triggersy manejo de errores, que no se pueden matricular mas de 30 estudiantes en unmismo curso (asuma un solo grupo por curso y periodo) y que un estudiante nopuede matricular un curso sin haber cumplido su prerequisito si lo tiene (asumaun unico prerequisito por curso)

Page 53: Talleres BD1

Capıtulo 12

Temas adicionales SQL

12.1. Vistas

Una vista es una tabla logica que no contiene datos en sı misma y que permiteacceder a los registros de otras tablas o vistas. Las tablas sobre las cuales esta basadala vista se denominan Tablas Base.Las vistas puede ser utilizadas para:

Restringir el acceso a ciertos usuarios sobre algunos atributos de tablas

Construir tablas producto de una consulta sobre varias tablas o vistas

Almacenar en la base de datos las consultas que se realizan con mayor frecuencia

A continuacion se presenta la sintaxis para crear una vista:

CREATE VIEW <NOMBRE> AS <QUERY>;

Por ejemplo, si se quiere ocultar a un usuario el sueldo de los empleados, se puede crearla siguiente vista:

CREATE VIEW EMP_MOD AS

SELECT EMPNO,ENAME,JOB

FROM EMP;

Sobre dicha vista es posible realizar algunas consultas como se muestra a contin-uacion:

SELECT EMPNO,ENAME

FROM EMP_MOD

WHERE EMPNO>=7900;

EMPNO ENAME

---- ------

7900 JAMES

7902 FORD

7934 MILLER

52

Page 54: Talleres BD1

CAPITULO 12. TEMAS ADICIONALES SQL 53

Como se menciono anteriormente, es posible realizar vistas sobre multiples tablas ovistas como en el siguiente ejemplo:

CREATE VIEW EMP_MOD2 AS

SELECT E.ENAME, D.DNAME

FROM EMP E, DEPT D

WHERE E.DEPTNO = D.DEPTNO;

12.2. Sinonimos

Un sinonimo es un alias (o nombre alternativo) que se le puede dar a una tabla,vista, funcion, paquete, procedimiento u otro sinonimo.A continuacion, se crea un sinonimo para la vista EMP MOD anterior:

CREATE SYNONYM MIS_EMP FOR EMP_MOD;

12.3. Indices

Los ındices son estructuras que permiten recuperar registros mas rapidamente. Enuna base de datos es posible crear ındices sobre una o varias columnas de una tabla.La sintaxis para la creacion del ındice es la siguiente:

CREATE INDEX <NOMBRE> ON <TABLA> (<LISTA DE ATRIBUTOS>);

Por ejemplo, si es muy frecuente realizar busquedas de empleados dado el nombre,es recomendable crear un ındice sobre dicha tabla de la siguiente forma:

CREATE INDEX EMP_NOM_IDX

ON EMP(ENAME);

12.4. Secuencias

Las secuencias son utiles para generar consecutivos. Por ejemplo, si la tabla CIUDADES

cuenta con una llave Codigo, para que el usuario no tenga que recordar o consultar cualfue el ultimo codigo creado, se puede crear una secuencia y realizar las insercioneshaciendo uso de esta:

SQL> CREATE SEQUENCE SEC_CIUDAD;

Sequence created.

-- INCREEMENTO DE LA SECUENCIA

SQL> SELECT SEC_CIUDAD.NEXTVAL FROM DUAL;

Page 55: Talleres BD1

CAPITULO 12. TEMAS ADICIONALES SQL 54

NEXTVAL

----------

1

-- EXTRACCION DEL VALOR ACTUAL DE LA SECUENCIA

SQL> SELECT SEC_CIUDAD.CURRVAL FROM DUAL;

CURRVAL

----------

1

-- USO DE LA SECUENCIA PARA INSERCION

SQL> INSERT INTO CIUDADES (CODIGO,NOMBRE)

VALUES (SEC_CIUDAD.NEXTVAL, ’CALI’);

1 row created.

SQL> INSERT INTO CIUDADES (CODIGO,NOMBRE)

VALUES (SEC_CIUDAD.NEXTVAL, ’BOGOTA’);

1 row created.

Page 56: Talleres BD1

Capıtulo 13

Consultas

13.1. Creacion de Tablas

CREATE TABLE PRODUCTOS(

CODIGO NUMBER PRIMARY KEY,

NOMBRE VARCHAR2(50) NOT NULL,

UNITARIO NUMBER (9,2) NOT NULL,

CANTIDAD NUMBER (4) NOT NULL);

CREATE TABLE CLIENTES(

CODIGO NUMBER(5) PRIMARY KEY,

NOMBRE VARCHAR2(50) NOT NULL

);

CREATE TABLE FACTURAS(

NUMERO NUMBER(5) PRIMARY KEY,

FECHA DATE DEFAULT SYSDATE,

CLIE_CODIGO NUMBER(5) REFERENCES CLIENTES

);

CREATE TABLE DETALLES(

FACT_NUM NUMBER(5) REFERENCES FACTURAS,

PRO_CODIGO NUMBER(5) REFERENCES PRODUCTOS,

CANTIDAD NUMBER(4) NOT NULL,

UNITARIO NUMBER(9,2) NOT NULL);

ALTER TABLE DETALLES ADD CONSTRAINT

DET_PK PRIMARY KEY(FACT_NUM,PRO_CODIGO);

55

Page 57: Talleres BD1

CAPITULO 13. CONSULTAS 56

13.2. Inserciones

INSERT INTO PRODUCTOS

(CODIGO,NOMBRE,UNITARIO,CANTIDAD)

VALUES (1,’P1’,500,30);

INSERT INTO PRODUCTOS

(CODIGO,NOMBRE,UNITARIO,CANTIDAD)

VALUES (2,’P2’,200,32);

INSERT INTO PRODUCTOS

(CODIGO,NOMBRE,UNITARIO,CANTIDAD)

VALUES (3,’P3’,369,41);

INSERT INTO PRODUCTOS

(CODIGO,NOMBRE,UNITARIO,CANTIDAD)

VALUES (4,’P4’,1254,98);

INSERT INTO PRODUCTOS

(CODIGO,NOMBRE,UNITARIO,CANTIDAD)

VALUES (5,’P5’,245,21);

INSERT INTO CLIENTES

(CODIGO, NOMBRE)

VALUES (1,’CLI-1’);

INSERT INTO CLIENTES

(CODIGO, NOMBRE)

VALUES (2,’CLI-2’);

INSERT INTO CLIENTES

(CODIGO, NOMBRE)

VALUES (3,’CLI-3’);

INSERT INTO CLIENTES

(CODIGO, NOMBRE)

VALUES (4,’CLI-4’);

INSERT INTO FACTURAS

(NUMERO, CLIE_CODIGO)

VALUES (1,1);

INSERT INTO FACTURAS

(NUMERO, CLIE_CODIGO)

VALUES (2,2);

INSERT INTO FACTURAS

(NUMERO, CLIE_CODIGO)

VALUES (3,3);

INSERT INTO FACTURAS

(NUMERO, CLIE_CODIGO)

VALUES (4,2);

INSERT INTO FACTURAS

Page 58: Talleres BD1

CAPITULO 13. CONSULTAS 57

(NUMERO, CLIE_CODIGO)

VALUES (5,1);

INSERT INTO DETALLES VALUES (1,1,20,400);

INSERT INTO DETALLES VALUES (1,2,4,300);

INSERT INTO DETALLES VALUES (1,3,6,400);

INSERT INTO DETALLES VALUES (2,4,8,300);

INSERT INTO DETALLES VALUES (2,5,4,400);

INSERT INTO DETALLES VALUES (3,1,12,300);

INSERT INTO DETALLES VALUES (3,2,15,450);

INSERT INTO DETALLES VALUES (3,3,32,470);

INSERT INTO DETALLES VALUES (4,4,11,300);

INSERT INTO DETALLES VALUES (5,5,8,256);

INSERT INTO DETALLES VALUES (5,1,2,365);

13.3. Consultas

Implementar las siguientes consultas:

1. Producto mas vendido (en cantidad)

2. Clientes que no tienen facturas

3. El total de ganancias del almacen por producto

4. El consecutivo, nombre del cliente y total de cada una de las facturas

5. El consecutivo de la factura junto con los nombres de los producto vendidos

6. Nombre de los productos vendidos en la factura 1 y 2 (sin repeticiones)

7. Promedio (en dinero) de ingresos por factura

8. Total , consecutivo y nombre del cliente de las facturas que superen los $5.000

9. Clientes que han comprado todos los productos

10. Clientes que nunca han comprado el producto 2

Page 59: Talleres BD1

Indice alfabetico

Indices, 53

Append, 8

Buffer, 8

Change, 8Check Constraint, 17Ciclos, 27Clear, 8Comandos Interactivos, 9Create Index, 53Create Synoym, 53Create table of, 20Create Trigger, 44Create type, 19Create View, 52Cursor, 29Cursores Parametrizables, 30

DDL, 16Del, 8Deleting, 46Diccionario de Datos, 36Disparador, 44Drop type, 20

Edit, 8Estructuras de Control, 26Excepciones, 48

Foreign Key, 17

Get, 8

If...Then...Else, 26Inicializacion de paquetes, 39Input, 8Inserting, 46

List, 8Llaves Foraneas, 17Llaves Primarias, 16Loops, 27

Manejo de errores, 48

ODL, 25Operador The, 23

Package Body, 39Paquetes, 38Primary Key, 16

Raise, 50Raise application Error, 48Restricciones, 17Rowtype, 28

Save, 8Scripts, 9Show error, 36Sinonimos, 53Sobrecarga de Funciones, 38SQL, 55SQLCODE, 50SQLERRM, 50Start, 8

Tablas anidadas, 21Tipos de datos, 28Trigger, 44

Unique, 17Updating, 46User Errors, 36User Objects, 36user objects, 36User Tables, 36

58

Page 60: Talleres BD1

INDICE ALFABETICO 59

Vistas, 52

When, 49