Está en la página 1de 123

BASES DE DATOS - B

Desarrollo de aplicaciones web

Ilerna

ILERNA, centro autorizado con código 25002775 (Lleida), 28077294 (Madrid) y 41023090 (Sevilla) www.ilerna.es
© Ilerna Online S.L., 2021

Maquetado e impreso por Ilerna Online S.L.

© Imágenes: Shutterstock

Impreso en España - Printed in Spain

Reservado todos los derechos. No se permite la reproducción total o parcial de esta obra, ni su incorporación a un
sistema informático, ni su transmisión en cualquier forma o por cualquier medio (electrónico, mecánico, fotoco-
pia, grabación u otros) sin autorización previa y por escrito de los titulares del copyright. La infracción de dichos
derechos puede constituir un delito contra la propiedad intelectual.

Ilerna Online S.L. ha puesto todos los recursos necesarios para reconocer los derechos de terceros en esta obra
y se excusa con antelación por posibles errores u omisiones y queda a disposición de corregirlos en posteriores
ediciones.

1.a edición: febrero 2021


ÍNDICE
Bases de datos - B

8. Tutorial de instalación SGBD Oracle................................................. 6


8.1. Instalación software JDK................................................................7
8.2. Instalación del servidor Oracle Database Express..................... 12
8.3. Instalación del cliente Oracle: SQL Developer........................... 16

9. Creación de bases de datos............................................................. 20


9.1. Creación de bases de datos en Oracle........................................ 21
9.2. Creación de BBDD en MySQL...................................................... 26

10. Gestión de usuarios......................................................................... 32


10.1. Administración de usuarios......................................................... 33
10.1.1. Administración de usuarios en Oracle......................... 33
10.1.2. Administración de usuarios en MySQL........................ 40
10.2. Administración de privilegios..................................................... 46
10.2.1. Administración de privilegios en Oracle...................... 46
10.2.2. Administración de privilegios en MySQL..................... 50
10.3. Administración de roles............................................................... 54
10.4. Administración de perfiles........................................................... 57
10.5. Normativa legal vigente sobre la protección de datos.............. 58

11. Programación en bases de datos (BBDD)....................................... 60


11.1. Entornos de desarrollo al entorno de las BBDD......................... 61
11.2. Sintaxis del lenguaje de programación....................................... 63
11.2.1. Bloques en PL/SQL........................................................ 63
11.2.2. Variables........................................................................ 64
11.2.3. Operadores.................................................................... 67
11.3. Procedimientos y funciones........................................................ 73
11.4. Control de errores........................................................................ 79
11.5. Cursores y transacciones............................................................. 83
11.6. Disparadores o triggers ............................................................... 93

12. Uso de las BBDD objeto-relacionales............................................. 98


12.1. Características............................................................................ 100
12.2. Tipos de datos objeto................................................................ 104
12.3. Definición de tipos de objeto.................................................... 104
12.4. Herencia...................................................................................... 109
12.5. Identificadores, referencias....................................................... 111
12.6. Tipos de datos colección........................................................... 112
12.7. Declaración e inicialización de objetos.................................... 115
12.8. Sentencia SELECT. Inserción, modificación y borrado de
objetos........................................................................................ 116

Bibliografía / webgrafía.....................................................................120

Solucionario .......................................................................................121
8
TUTORIAL DE INSTALACIÓN SGBD ORACLE
Bases de datos - B

Para la instalación del SGBD de Oracle necesitamos instalar


primero el software de Java correspondiente. Por tanto, en
este tema analizaremos primero la instalación de la herra-
mienta JDK, y después del cliente y el servidor Oracle.

8.1.  Instalación software JDK


El SGBD de Oracle está desarrollado en Java y se ejecuta
sobre la plataforma de Java, por tanto, para usar la BD de
Oracle debemos tener instalada en nuestra computadora
una serie de requisitos Java.

Oracle nos suministra vía web la herramienta JDK (Java


Development Kit), que es una herramienta que todo pro-
grama implementado en Java necesita tener.

Para instalar JDK en nuestra computadora debemos seguir


estos pasos:

1. Accedemos a la página web oficial de Oracle.

BUSCA EN LA WEB

www.oracle.com/es/index.html

2. Navegamos por la web hasta acceder a la sección de


descargas JDK.

BUSCA EN LA WEB

www.oracle.com/technetwork/es/java/javase/
downloads/index.html

7
Tema 8: Tutorial de instalación SGBD Oracle

3. Seleccionamos la descarga para el sistema operativo y


arquitectura que nos corresponda en nuestra computadora
(Windows, Linux, MacOS…).

8
Bases de datos - B

4. Aceptamos las condiciones de uso antes de la descarga.

5. Oracle nos solicitará una cuenta. En caso de no tenerla,


podemos crear una fácil y gratis.

9
Tema 8: Tutorial de instalación SGBD Oracle

6. Una vez realizado el paso anterior, descargaremos en


nuestra computadora el software JDK de Oracle.

7. Una vez descargado, comenzaremos con el proceso de


instalación.

8. La instalación nos pregunta por la ruta de la carpeta de


instalación. Tiene una asignada por defecto, pero podemos
cambiarla haciendo clic en Change.

10
Bases de datos - B

9. La instalación avanzará de manera automática.

10. Hasta que el programa de instalación nos avise de que


ya está instalado. Adicionalmente, nos ofrece la opción de
acceder a tutoriales, guías y otros contenidos. Esto no es
estrictamente necesario, pero podríamos optar por ello
haciendo clic en Next Steps:

11
Tema 8: Tutorial de instalación SGBD Oracle

8.2.  Instalación del servidor


Oracle Database Express
Una vez ya tenemos instalado el JDK, pasaremos a descar-
gar e instalar el servidor de la BD. Oracle posee diversos
SGBD, pero en nuestro caso usaremos Oracle Database
Express que, hasta la fecha, es el único servidor de BBDD
que Oracle suministra de manera gratuita.

1. Accedemos a la sección de descarga de Oracle Database


Express dentro de la web de Oracle y seleccionamos la op-
ción Descargar.

BUSCA EN LA WEB

www.oracle.com/es/database/technologies/
appdev/xe.html

2. Elegimos la descarga correspondiente según el sistema


operativo de nuestra computadora. Para ello, la web nos
solicitará aceptar las condiciones de uso y tener una cuenta
de Oracle, al igual que en el proceso de descarga e instala-
ción del JDK.

12
Bases de datos - B

3. Tras el paso anterior, un archivo con el software de-


seado se descargará en modo comprimido en nuestra
computadora.

4. Una vez descargado el archivo, lo descomprimimos.

5. Una vez descomprimido, pasamos a la configuración e


instalación del servidor. Para ello, ejecutamos el archivo de
configuración llamado Setup.

6. Nos aparecerá un asistente de instalación que nos


guiará durante dicho proceso, en el que nos pedirá la con-
firmación de acuerdo de licencia y la carpeta a usar para la
instalación.

13
Tema 8: Tutorial de instalación SGBD Oracle

7. Llegado el momento, el sistema nos pedirá una con-


traseña para el servidor. Es muy importante recordar esta
contraseña, porque en caso de olvidarla, probablemente
tendríamos que volver a instalar el servidor. Una vez sumi-
nistrada la contraseña, seleccionamos la opción Siguiente y
confirmamos la instalación.

14
Bases de datos - B

8. A continuación, la instalación se efectuará. Puede tardar


unos minutos.

9. Cuando el asistente finalice la instalación, solo quedará


seleccionar la opción Terminar.

Tras este proceso, ya tenemos instalado el servidor de la


BD. Ya solo nos falta instalar la parte del cliente.

15
Tema 8: Tutorial de instalación SGBD Oracle

8.3.  Instalación del cliente


Oracle: SQL Developer
Una vez realizada la instalación de la parte del servidor,
procederemos a instalar la parte del cliente. Para ello usa-
remos el software Oracle SQL Developer. El software cliente
se conectará al software servidor y le lanzará las consultas
SQL. Por tanto, debe existir una conexión entre Database
Express y SQL Developer.

Los pasos que debemos seguir para la instalación del SQL


Developer de Oracle son: descargar el software, desem-
paquetar y descomprimir el software y ejecutarlo. Los
detallamos a continuación.

1. Accedemos a la página web de Oracle y accedemos a la


sección del SQL Developer.

BUSCA EN LA WEB

www.oracle.com/es/tools/downloads/sqldev-v192-
downloads.html

16
Bases de datos - B

2. Seleccionamos la descarga adecuada en función de


nuestro sistema operativo. Aceptamos los términos y con-
diciones para la descarga del software.

3. Al igual que con otras instalaciones de Oracle, la web nos


pedirá estar registrados en una cuenta de Oracle. Podemos
usar la misma cuenta que utilizamos anteriormente.

4. Una vez validada nuestra cuenta, se descargará automá-


ticamente el archivo de SQL Developer.

17
Tema 8: Tutorial de instalación SGBD Oracle

5. El archivo se descargará en un formato comprimido. De-


bemos extraerlo para su utilización normal.

6. Una vez lo hayamos extraído, haremos doble clic sobre


el ejecutable. El sistema probablemente nos pedirá la ruta
donde está ubicado el JDK que hemos instalado anterior-
mente. Entonces, se abrirá el software SQL Developer.

18
Bases de datos - B

7. Una vez comprobado que el cliente SQL Developer fun-


ciona correctamente, es recomendable crear un acceso
directo de esta aplicación en el escritorio.

ponte a prueba

Indica el orden correcto que debemos seguir


para instalar SQL Developer de Oracle.
a) Descargar, descomprimir, desempaquetar y
ejecutar
b) Descargar, desempaquetar, ejecutar y
descomprimir
c) Descargar, desempaquetar, descomprimir y
ejecutar
d) Desempaquetar, descargar, descomprimir y
ejecutar

19
9
CREACIÓN DE BASES DE DATOS
Bases de datos - B

En este tema vamos a aprender a crear una BD, tanto en el


SGBD de Oracle como en el SGBD de MySQL. Emplearemos
el mismo ejemplo para ambos sistemas.

En el caso del SGBD de Oracle, primero deberemos enlazar


manualmente la parte del cliente con la del servidor. En el
caso de MySQL y Workbench, por defecto deberían estar
conectados.

9.1.  Creación de bases de datos


en Oracle
Antes de empezar con la creación de la BD vamos a co-
nectar el software cliente con el servidor. Lo primero que
haremos es comprobar que el servidor se está ejecutando.

De no ser así, basta con hacer doble clic sobre su


icono en el escritorio.

A continuación, ejecutaremos el cliente y, accedien-


do a Conexiones, crearemos una nueva conexión (+).

Nota: En el caso de no tener un icono en el escritorio, po-


demos abrir tanto el software cliente como el servidor a
través de la consola del sistema operativo. Para ello, se
debe conocer la ruta donde está instalado.

Para comprobar en el sistema operativo si el software ser-


vidor se está ejecutando, podemos listar todos los servicios
que están en ejecución. En el caso de Windows, podemos
consultarlo en la opción Servicios, tal como se muestra en
esta imagen, en la cual podemos observar cómo los pro-
cesos ServiceXE y el TNSListener están en ejecución, por lo
que nos aseguramos de que el servidor está activo.

Para simplificar la prueba, vamos a nombrar la conexión


exactamente igual que al usuario que la va a utilizar. Por
tanto, el nombre de la conexión va a ser SYSTEM.
• Usuario: SYSTEM
• Contraseña: root

21
Tema 9: Creación de bases de datos

Si quisiéramos un usuario diferente, tendríamos que crear-


lo primero en el servidor para que, después, pudiéramos
utilizarlo en una conexión.

Podemos seleccionar la opción Guardar contraseña para


que quede memorizada y no nos la vuelva a pedir. Se-
guidamente, probaremos la conexión comprobando que
el estado es correcto. Una vez hecha esta comprobación,
podremos guardar y conectar.

En la imagen observamos numerados el orden de los


pasos que se deben seguir para la nueva conexión.

22
Bases de datos - B

Si hemos seguido los pasos correctamente, tendremos una


conexión a la BD perfectamente funcional y con todos los
privilegios.

23
Tema 9: Creación de bases de datos

A continuación, veremos los diferentes pasos para crear las


tablas dentro de una conexión que actuará como BD.

1. Creamos las tablas mediante comandos SQL.

2. A continuación, seleccionamos los comandos y pulsa-


mos sobre el acceso directo Sentencia de ejecución.

24
Bases de datos - B

3. Para comprobar que las órdenes han sido efectuadas con


éxito, refrescamos la conexión y, en el apartado de Tablas
deben aparecer las que hemos creado.

ponte a prueba

Las conexiones a BBDD no


utilizan nunca de contraseña,
ya que esta podría deshabi-
litar el usuario principal del
sistema.
a) Verdadero
b) Falso

25
Tema 9: Creación de bases de datos

9.2.  Creación de BBDD en


MySQL
Para crear una BBDD en MySQL daremos los siguientes
pasos:
1. Iniciar correctamente MySQL Workbench.
2. Conectarnos al servidor.
3. Codificar un ejemplo de una BD nueva.
4. Guardar la BD en el sistema.
5. Asegurarse de que la BD queda almacenada correcta-
mente.

1. Lo primero que debemos hacer es abrir MySQL Work-


bench. Para ello, debemos buscar la aplicación en nuestro
sistema operativo y ejecutarla. Por ejemplo, en Windows
10 podemos escribir directamente workbench en la barra
de tareas y hacer clic en el icono de MySQL Workbench.

De tal modo que se debería abrir MySQL Workbench en


nuestro sistema.

26
Bases de datos - B

2. Como podemos observar en la imagen anterior, Wor-


kbench nos ofrece la opción de conectarnos al servidor
MySQL.

Al hacer doble clic en la referencia al servidor, el sistema


nos pedirá la contraseña para conectarnos al mismo.

El Workbench nos abrirá una nueva pestaña. Si deseamos


conocer más detalles sobre la conexión al servidor, po-
demos hacer clic en la opción Server Status, tal como se
señala en la imagen.

27
Tema 9: Creación de bases de datos

Al hacer clic en Server Status podremos conocer los detalles


de la conexión al servidor.

3. Para crear código MySQL en Workbench utilizaremos el


editor de textos que nos ofrece Workbench.

En el editor codificaremos la BD deseada. En este caso,


usaremos el mismo ejemplo de una BD nueva que hicimos
con Oracle:

28
Bases de datos - B

4. Cuando el código de la nueva BD ya esté creado, debemos


ejecutarlo para que se almacene en el SGBD. Al ejecutarlo,
Workbench nos informará del éxito de la operación o de
los posibles errores, en caso de que los hubiese. Para ello
debemos presionar el símbolo del rayo.

Al ejecutarse el código, Workbench nos informará del éxito


o error del código en la sección inferior Action Output. En
este caso el código se ejecutó correctamente.

5. Al ejecutarlo de manera exitosa, la nueva BD quedará


registrada en el servidor. Para verla en la sección de SCHE-
MAS, debemos hacer clic en el símbolo de Actualizar.

29
Tema 9: Creación de bases de datos

Independientemente de la BD ya creada y guardada en


el servidor, es conveniente guardar el código que hemos
creado en Workbench. Para ello usaremos el icono Guardar.

De este modo, habremos finalizado la tarea de Crear una


BD nueva en el servidor MySQL a través de la interfaz grá-
fica de MySQL Workbench.

ponte a prueba

En MySQL Workbench es posible conocer los


detalles de conexión al servidor, ¿cuál de las
siguientes opciones utilizaremos?
a) Server Status
b) Check connection
c) Data show
d) Status variables
30
Bases de datos - B

31
10
GESTIÓN DE USUARIOS
Bases de datos - B

10.1.  Administración de usuarios


Para interactuar con una BD se utilizan los usuarios. Existen
usuarios de todo tipo: desde usuarios de sistema hasta
usuarios con muchas restricciones.

Las BBDD albergan una lista válida de usuarios a los que se


les permite la conexión al sistema. Por este, motivo se debe
crear una cuenta de usuario para cada persona que preten-
da acceder a la BD, en la que se especifique: el nombre de
usuario, el método de autentificación, el perfil de usuario
y, en el caso de Oracle, el tablespace.

10.1.1.  Administración de usuarios en


Oracle
En Oracle vamos a diferenciar las dos formas por las que
se puede autentificar un usuario:

• Autentificación por BD: la administración de la cuenta


es de tipo usuario/contraseña, de forma que se va a guar-
dar encriptada y su autentificación se realizará por Oracle.
• Autentificación externa: la cuenta la mantiene Oracle,
aunque la administración de la contraseña y la auten-
tificación de usuario es realizada externamente por el
sistema operativo. El usuario tiene la posibilidad de co-
nectarse a la BD sin necesidad de indicar el nombre del
usuario o la clave, porque es el mismo nombre de usuario
del sistema operativo.
• Cuentas administrativas: tal como hemos podido com-
probar al instalar Oracle, existen por defecto dos cuentas
con permisos administrativos concedidos para realizar
tareas de optimización y monitorización de las BBDD.
– SYS: funciona como súper administrador de la BD (rol
de DBA) y no interesa modificar su esquema porque es
donde se crea el diccionario de datos.
– SYSTEM: contiene el mismo rol que la anterior y, por
defecto, tiene una serie de tablas y vistas administrati-
vas ya creadas.
– SYSMAN: realiza tareas administrativas utilizando En-
terprise Manager.
– DBSMNP: controla la aplicación Enterprise Manager.
• Privilegios administrativos: la seguridad en las BBDD
es un factor muy importante, ya que en caso de violacio-
nes de seguridad los datos pueden quedar expuestos.
Por este motivo, hay que estar muy atentos a los privilegios
y accesos que se otorgan a los DBA (administradores de

33
Tema 10: Gestión de usuarios

base de datos). Existen ciberataques dirigidos especial-


mente a los usuarios con más privilegios en una empresa,
aprovechando sus cuentas para hacer un mal uso.

Para evitar este tipo de incidentes, se recomienda realizar


una separación de responsabilidades. Esta separación con-
siste en dividir las tareas administrativas entre diferentes
usuarios y evitar que recaigan en un solo individuo todo-
poderoso. Esto reduce la probabilidad de que un usuario
abuse de los privilegios y, por otro lado, minimiza el riesgo
de recibir un ataque en este tipo de cuentas.

Existen dos grandes privilegios administrativos del sistema


capacitados para realizar operaciones de alto nivel, como
crear, cerrar, iniciar, realizar copias de seguridad o recupe-
rar la BD:

• SYSDBA: tiene un control total sobre la BD.


• SYSOPER: permite al usuario realizar las tareas operati-
vas básicas, pero sin poder visualizar los datos.

Una buena práctica para realizar la separación de respon-


sabilidades es evitar utilizar el privilegio SYSDBA y, en su
lugar, conceder privilegios más específicos como SYSBAC-
KUP, SYSDG, SYSRAC y SYSKM para realizar las tareas de
copias de seguridad de la BD, gestión de la protección de
los datos, gestión de RAC y gestión de las credenciales de
usuarios.

La vista v$PWFILE_USERS nos permite examinar a los


usuarios administrativos.

Características de los usuarios de Oracle

Como hemos explicado anteriormente, los usuarios deben


poseer un nombre. Veamos las restricciones que existen a
la hora de crearlos:

• Nombre usuario: debe ser único e irrepetible. Su longitud


máxima no ha de sobrepasar los 30 caracteres. Además,
solamente puede contener caracteres alfanuméricos y los
signos $ y _como caracteres especiales.
• Configuración física: espacio que posee el usuario para
almacenar su información y límite de almacenamiento.
En Oracle se denomina tablespace.
• Perfil asociado: son los diferentes recursos de los que
dispone el usuario del sistema.
• Privilegios y roles: concesión de funciones que pueden
realizar los usuarios.

34
Bases de datos - B

STATUS (estados) de una cuenta de usuario

• OPEN (abierta): el estado de la cuenta es accesible, por


lo que el usuario puede trabajar sin problema en las ac-
ciones habilitadas.
• EXPIRED (expirada): la cuenta de usuario ha agotado el
tiempo máximo del que disponía, por lo que su acceso
queda denegado.
• EXPIRED GRACE (expirada en gracia): la cuenta ha ca-
ducado, pero sigue siendo accesible. En este estado, se
conceden X días para cambiar la contraseña antes de de-
negar el acceso.
• LOCKED (bloqueada): el administrador del sistema ha
bloqueado la cuenta, por lo que el usuario no podrá rea-
lizar ninguna acción.
• LOCKED TIMED (bloqueada por tiempo): tras varios
intentos fallidos de inicio de sesión, la cuenta queda blo-
queada temporalmente (FAILED_LOGIN_ATTEMPTS).
• EXPIRED & LOCKED (expirada y bloqueada): la cuenta
ha caducado y ha sido bloqueada por el administrador del
sistema.

Creación de usuario

Antes de comenzar con la creación de usuarios, debemos


asegurarnos de que nos conectamos a un usuario que
posee permisos concedidos para la creación de usuarios.

Existen dos formas diferentes para conectarnos a un usuario:


1. Mediante la creación de una conexión, como hemos
visto en el apartado anterior con el usuario SYSTEM
2. Mediante comandos en Oracle (Run SQL Command Line)

35
Tema 10: Gestión de usuarios

La sentencia para crear una cuenta de usuario que permita


la autentificación de este en el SGBD con un nivel determi-
nado de privilegios es:

Sintaxis

CREATE USER nombre_usuario IDENTIFIED BY


'passwords' [opciones];

Ejemplo

CREATE USER ilerna IDENTIFIED BY 'root';


Para saber a qué usuario estamos conectados utilizaremos
el siguiente comando:

Ejemplo

SHOW USER

Si estamos trabajando con las hojas de trabajo del


cliente de Oracle SQL Developer, hay que tener en
cuenta que, al crear un usuario y conectarnos a él,
una vez terminemos el script, este se desconectará
automáticamente. En el caso de estar utilizando
la consola de comandos, este usuario se quedará
conectado hasta que cerremos la conexión o la
consola.

Sentencia de creación y conexión:

CREATE USER ilerna IDENTIFIED BY 'root';


GRANT CREATE SESSION TO ilerna;
CONN ilerna / root

Cuando se crea un usuario, también podemos elegir las


siguientes opciones:

Sintaxis

CREATE USER nombre {IDENTIFIED BY 'contraseña'|


EXTERNALLY | GLOBALLY AS nombreGlobal}
[DEFAULT TABLE SPACE tableSpacePorDefecto]
[TEMPORARY TABLESPACE tableSpacetTemporal]
[QUOTA{cantidad[K|M]|UNLIMITED}ON tablespace
[QUOTA{cantidad[K|M]|UNLIMITED}ON tablespace[…]]]
[PASSWORD EXPIRE]
[ACCOUNT{UNLOCK|LOCK}];
[PROFILE{perfil|DEFAULT}]

36
Bases de datos - B

Ejemplo

CREATE USER ilerna IDENTIFIED BY 'root'


DEFAULT TABLESPACE 'Alumnos'
QUOTA 15M ON 'Alumnos'/*Se dan 15MBytes de espacio en el tablespace*/

Modificación de usuario

Sintaxis

ALTER USER nombre_usuario [opciones];

Ejemplo

ALTER USER ilerna ACCOUNT UNLOCK;

Para quitarle el límite de cuota:

Ejemplo

ALTER USER ilerna QUOTA UNLIMITED ON Alumnos;

37
Tema 10: Gestión de usuarios

Borrado de usuario

Sintaxis

DROP USER nombre_usuario [CASCADE];

La opción CASCADE elimina primero los objetos que


están asociados al usuario y, después, el usuario. Por
tanto, emplearemos la opción de eliminar el usuario
con CASCADE si tenemos intención de borrar todos sus
objetos asociados:

Ejemplo

DROP USER ilerna CASCADE;

Cada vez que borremos un usuario, borraremos también


el esquema asociado a sus objetos.

Consulta de usuario
Mediante DBA_USERS se muestra la lista y configuración
de los usuarios del sistema. Para visualizar la estructura
de un usuario podemos utilizar el comando DESC DBA_
USERS o DESCRIBE DBA_USERS. DESC es un diminutivo
de DESCRIBE.

Ejemplo

DESC DBA_USERS;

Para conocer todos los usuarios del sistema podemos usar


la siguiente expresión:

Ejemplo

SELECT * FROM DBA_USERS;

Espacios en tablas (tablespaces)


Los espacios de tablas son almacenes para estructuras de
una BD (tablas, vistas, procedimientos, etc.). Una BD cons-
ta de uno o más espacios de tablas.

Por defecto, Oracle crea los siguientes tablespaces:


1. SYSTEM (diccionario de datos)
2. SYSAUX (componentes opcionales de la BD)
3. TEMP
4. UNDOTBS1 (undotablespace, para rollbacks de transac-
ciones)
5. USERS

38
Bases de datos - B

Operaciones con espacios de tablas


Vemos la sintaxis de creación de un tablespace que contie-
ne todas las opciones que le podemos indicar.

Para crear un tablespace asociado a un usuario lo primero


que haremos es crear el espacio de tablas relacionado con
un fichero físico de nuestro equipo:

Sintaxis

CREATE [TEMPORARY/UNDO] TABLESPACE <tablespace_nombre>


DATAFILE/TEMPFILE'<datafile01_name y el Path donde creamos el fichero> 'SIZE
<INTEGERN>[,
'<datafile02_name y el Path donde creamos el fichero>' SIZE <INTEGERN>[,
'<datafile0N_name y el Path donde creamos el fichero>'SIZE<INTEGERN>[,...]]]
BLOCKSIZE <DB_BLOCK_SIZE parameter/2k/4k/8k/16k/32k>
AUTOEXTEND {[OFF/ON(NEXT<INTEGERK/M> MAXSIZE <INTEGERK/M>)/UNLIMITED]}
LOGGING/NOLOGGING(Logging default)
ONLILE/OFFLINE(Online default)
EXTENT MANAGEMENT {[DICTIONARY]
[LOCAL default (AUTOALLOCATE/UNIFORM <INTEGERK/M>)]}
PERMANENT/TEMPORARY(Permanent default)
MINIMUM EXTENT
DEFAULT STORAGE {[INITIAL<INTEGERK/M>]
[NEXT <INTEGERK/M>]
[PCTINCREASE <INTEGERK/M>]
[MINEXTENTS <INTEGER>]
[MAXEXTENTS <INTEGER>/UNLIMITED]
[FREELISTS <INTEGER>]
[FREELISTSGROUPS <INTEGER>]
[OPTIMAL <INTEGER>/NULL]
[BUFFER_POOL <DEFAULT/KEEP/RECYCLE>]}
CHUNK <INTEGERK/M>
NOCACHE;

Y, a continuación, creamos el usuario relacionado con la


tabla de espacios anterior:

Ejemplo

CREATE USER ilerna IDENTIFIED BY 'root'


DEFAULT TABLESPACE ejercicios;

39
Tema 10: Gestión de usuarios

10.1.2.  Administración de usuarios en


MySQL
Cuentas reservadas
MySQL posee algunas cuentas predefinidas o reservadas
que vienen por defecto al instalar el SGBD de MySQL. Son
las siguientes:

• ROOT: cuenta que tiene todos los privilegios en el SGBD.


Puede realizar cualquier operación. Por motivos de se-
guridad, es posible cambiar el nombre de ROOT por otro
diferente, dada la gran cantidad de privilegios que posee
esta cuenta y lo llamativo del nombre ROOT que puede
resultar para un usuario malintencionado.
• MYSQL.SYS: se usa para definir objetos del esquema
sys (vistas, procedimientos, funciones, etc.). Esta cuenta
soluciona el problema en el caso de que la cuenta ROOT
fuese eliminada. Esta cuenta está protegida, de modo
que no acepta conexiones desde clientes.
• MYSQL.SESSION: cuenta usada internamente por plu-
gins (aplicaciones de extensión, complementos) para
acceder al servidor. Esta cuenta está protegida, de modo
que no acepta conexiones desde clientes.

Privilegios administrativos
En MySQL existen tres privilegios administrativos que son
los siguientes:

• Privilegios de administrador: permite al usuario reali-


zar acciones en el servidor MySQL de manera global, es
decir, en cualquier BD contenida en el servidor.

40
Bases de datos - B

• Privilegios de una BD: son aquellos que atañen a una BD


y todos los objetos que hubiese dentro de dicha BD, tales
como tablas, índices, vistas, etc.
• Privilegios de objetos: son los privilegios que se aplican
a objetos concretos de una BD, tales como tablas, rutinas,
vistas, etc.

Creación de usuarios
Existen dos formas diferentes de un usuario: mediante la
interfaz gráfica de Workbench y mediante comandos.
1. Mediante la interfaz gráfica.

Debemos hacer clic en Users and Privileges, de modo


que aparecerá la pestaña de usuarios y privilegios con
la lista de los usuarios existentes. Para crear uno nuevo
clicaremos en AddAccount, tal como se señala en la
imagen anterior.

41
Tema 10: Gestión de usuarios

Al hacer clic en Add account se nos abrirán las pestañas


de especificación del nuevo usuario. En ellas podemos
asignar el nombre de usuario, tipo de autentificación,
contraseña, privilegios, restricciones de acceso, etcétera.
2. Mediante comandos
Para crear un usuario nuevo en MySQL por medio de
comandos podemos utilizar CREATE USER.

Sintaxis

CREATE USER nombre_usuario IDENTIFIED BY


'password';

Ejemplo

CREATE USER 'mrobinson'@'localhost'


IDENTIFIED BY 'mypassword123';

En nuestro ejemplo, creamos un usuario sin especificar


ninguna característica, de modo que MySQL asigna dichas
características por defecto. Sin embargo, la sintaxis com-
pleta de CREATE USER puede ser mucho más extensa. La
sintaxis completa de CREATE USER es la siguiente:

Sintaxis

CREATE USER [IF NOT EXISTS]


user [auth_option][, user [auth_option]]…
[REQUIRE {NONE|tls_option[[AND]tls_option]…}]
[WITH resource_option [ resource_option ] … ]
[password_option | Lock_option] …

Para ver todas las opciones se puede consultar el manual


MySQL (en inglés) en su página web oficial:

BUSCA EN LA WEB

dev.mysql.com/doc/refman/8.0/en/create-user.html

Modificación de usuario
Para modificar una cuenta de usuario en MySQL usamos
el comando ALTER USER. Este comando pueden ejecutarlo
solo los usuarios con privilegios de administrador en su
cuenta o también los que tengan el privilegio del comando
UPDATE.

42
Bases de datos - B

Para listar los usuarios existentes en el sistema y ver qué


privilegios tiene cada uno podemos utilizar la siguiente
sentencia:

SELECT * FROM mysql.user;

Al realizar dicha sentencia, MySQL Workbench nos infor-


mará de las cuentas de usuario existentes y sus privilegios,
como se observa en la imagen siguiente.

Cuando usamos el comando ALTER USER modificamos


las propiedades de una cuenta de usuario, de modo
que aquellas propiedades que no se especifiquen en la
sentencia mantendrán los valores que tenían asignados
anteriormente.

Sintaxis

ALTERUSER [ IF EXISTS ]
User [auth_option] [, user [auth_option]] …
[REQUIRE {NONE | tls_option [[AND] tls_option… }]
[WITH resource_option [resource_option] …]
[password_option | Lock_option ] …

Con la siguiente sentencia actualizaremos la contraseña de


una cuenta de usuario concreto.

Ejemplo

ALTER USER 'mrobinson'@'localhost' IDENTIFIED BY 'newpassword456';

Si además queremos fijar el requisito de que el usuario


tenga que establecer una contraseña nueva cada 200 días,
además de otro tipo de autentificación, lo expresaremos a
través de la siguiente sentencia.

Ejemplo

ALTER USER 'mrobinson'@'localhost' IDENTIFIED WITH sha256_password BY


'new_password' PASSWORD EXPIRE INTERVAL 200 DAY;

43
Tema 10: Gestión de usuarios

Borrado de usuario
En MySQL la sentencia DROP USER se utiliza para elimi-
nar un usuario junto con sus privilegios. Su sintaxis es la
siguiente.

Sintaxis

DROP USER [IF EXISTS] 'nombre_usuario'@ 'dominio_usuario';

Como se puede observar en el código, el nombre del usua-


rio y su dominio debe estar entrecomillado y con una @
entre ambos.

Para que un usuario borre otro usuario, el primero debe


tener el privilegio de crear usuarios (CREATE USER) o el de
eliminarlos (DELETE USER).

En versiones de MySQL anteriores a la 5.0.2 el comando


DROP USER solo permite borrar usuarios que no tengan
privilegios asociados, pero en las versiones de MySQL 5.0.2
y posteriores sí es posible.

Si realizamos un DROP USER sobre una cuenta de usuario


que en ese instante está abierta, la sentencia no se hará
efectiva hasta que la sesión del usuario a borrar se haya
cerrado. Una vez se haya cerrado dicha sesión, la cuenta se
eliminará y, por tanto, no se podrá abrir más veces la sesión
con esa cuenta de usuario.

A continuación, vemos un ejemplo de borrado de un usuario.

Sintaxis

DROP USER 'mrobinson' @ 'localhost';

44
Bases de datos - B

ponte a prueba

¿Cuáles de las siguientes características siguientes debería de cumplir un


usuario de BBDD?
a) El nombre de usuario no debe sobrepasar los 30 caracteres.
b) El usuario debe tener asignados privilegios y permisos.
c) No debe contener una contraseña.
d) A y B son correctas.

Las cuentas de BBDD no tienen diferentes estados, se crean y se


eliminan, pero siempre con el mismo estado.
a) Verdadero.
b) Falso.

Una buena práctica es evitar hacer uso del privilegio SYSDBA, para
ello existen diferentes tipos de privilegios dependiendo de la tarea
que deseemos realizar. Si se pretende gestionar las credenciales de los
usuarios, ¿qué privilegio se utilizará?
a) SYSBACKUP.
b) SYSKM.
c) SYSDG.
d) SYSRAC.

Mediante el comando DBA_USERS se muestra la lista y configuración


de los usuarios del sistema. Entre los siguientes comandos, ¿cuál es el
correcto para visualizar la estructura?
a) DESC DBA_USERS.
b) SHOW USERS.
c) SHOW DBA_USERS.
d) DESCRIPT DBA_USER.

Existen varias formas de crear usuarios en MySQL. Indica cuál de ellas es


la correcta.
a) Mediante interfaz gráfica.
b) Modificando usuarios.
c) Mediante comandos.
d) Las respuestas a y c son correctas.
e) Las respuestas a, b y c son correctas.

45
Tema 10: Gestión de usuarios

10.2.  Administración de
privilegios
Los privilegios son aquellos permisos y derechos que po-
seen los usuarios de una BD que les permiten manipular los
objetos que haya en la BD. Es decir, los privilegios represen-
tan las opciones que se les han asignado a los usuarios de
una determinada BD para realizar acciones cómo:

• Ejecutar un tipo de sentencia SQL.


• Acceder a un objeto de otro usuario.
• Ejecutar distintos procedimientos.
Los privilegios permiten jerarquizar el uso de una BD, de
manera que nos aseguramos de que solo los usuarios ade-
cuados puedan modificar ciertos elementos delicados de
la BD. De esta manera ganamos seguridad en la BD.

Los privilegios se pueden asignar a los usuarios de manera


explícita o también se pueden asignar por medio de roles,
que veremos más adelante.

10.2.1.  Administración de privilegios en


Oracle
En Oracle podemos diferenciar entre dos tipos de privile-
gios:

• Privilegios de sistema: ofrecen la posibilidad de reali-


zar determinadas acciones de administración en la BD,
en cualquier esquema. Afecta a todos los usuarios. Por
ejemplo, CREATE USER o CREATE TABLE.
• Privilegios de objetos: ofrecen a un usuario la posibili-
dad de acceder, manipular o ejecutar objetos concretos
(tablas, vistas, secuencias, procedimientos, funciones o
paquetes). Por ejemplo, borrar o consultar filas de una
tabla concreta
Al igual que en otros SGBD, el comando que asigna los pri-
vilegios en Oracle es GRANT. De la misma forma que se le
pueden asignar privilegios, usando el comando REVOKE se
le pueden denegar.

Para asignar privilegios, la sintaxis del comando GRANT es:

Sintaxis

GRANT tipo_privilegio [(columna)][,tipo_privilegio[(columna)]…


ON {nombre_tabla|*|*.*|base_datos.nombre_tabla}
TO usuario [IDENTIFIED BY[PASSWORD]'password']]…
[WITH option[,opción]…

46
Bases de datos - B

GRANTOPTION
|MAX_QUERIES_PER_HOUR count
|MAX_UPDATES_PER_HOUR count
|MAX_CONNECTIONS_PER_HOUR count
|MAX_USER_CONNECTIONS count

En este caso:

• tipo_privilegio: es el tipo de permiso que se le asigna al


usuario (select, insert, update, etc.)
• Los objetos sobre los que puede operar el usuario y los
privilegios que se le pueden aplicar se muestran en las
siguientes expresiones:
– nombre_tabla→ sobre la tabla nombre_tabla.
– *→ sobre todas las tablas de la BD que se está utilizando.
– *.*→ sobre todas las tablas de todas las BBDD.
– Base_datos.*→ sobre todas las tablas de la BD base_
datos.
– Base_datos.nombre_tabla→ sobre la tabla nombre_
tabla que pertenece a la BD base_datos.

47
Tema 10: Gestión de usuarios

• TO: indica el usuario al que se quiere otorgar el permiso.


Si este no existe, se crea con el password indicado me-
diante la cláusula IDENTIFIED BY.
• WITH permite indicar ciertas opciones:

Expresión Función

GRANT OPTION Concede a otros usuarios los permisos que


tiene el primer usuario.

MAX_QUERIES_PER_HOUR count Restringe el número de consultas por hora


que puede realizar un usuario.

MAX_UPDATES_PER_HOUR count Restringe el número de modificaciones por


hora que puede realizar un usuario.

MAX_CONNECTIONS_PER_HOUR count Restringe las conexiones por hora que realice


un usuario.

MAX_USER_CONNECTIOS count Limita el número de conexiones simultáneas


que puede tener un usuario.

Tipos de privilegios

Privilegio Significado

ALL Da todos los permisos simples excepto GRANT OPTION.

ALTER Permite el uso de ALTER TABLE.

ALTER Modifica o borra rutinas almacenadas.


ROUTINE

CREATE Permite el uso de CREATE TABLE.

CREATE Crea rutinas almacenadas.


ROUTINE

CREATE Permite el uso de CREATE TEMPORARY TABLE.


TEMPORARY
TABLES

CREATE USER Permite el uso de CREATE USER, DROP USER, RENAME USER y REVOKE.

48
Bases de datos - B

CREATE VIEW Permite el uso de CREATE VIEW.

DELETE Permite el uso de DELETE.

DROP Permite el uso de DROP TABLE.

EXECUTE Permite al usuario ejecutar rutinas almacenadas.

FILE Permite el uso de SELECT, INTO OUTFILE y LOAD DATA INFILE.

INDEX Permite el uso de CREATE INDEX y DROP INDEX.

INSERT Permite el uso de INSERT.

LOCK TABLES Permite el uso de LOCK TABLES en tablas para las que tenga el
permiso SELECT.

PROCESS Permite el uso de SHOW FULL PROCESSLIST.

RELOAD Permite el uso de FLUSH.

REPLICATION Permite al usuario preguntar dónde están los servidores maestros o


CLIENT esclavos.

REPLICATION Necesario para los esclavos de replicación.


SLAVE

SELECT Permite el uso de SELECT.

SHOW Muestra todas las BBDD.


DATABASES

SHOW VIEW Permite el uso de SHOW CREATE VIEW.

SHUTDOWN Permite el uso de mysqladmin shutdown.

UPDATE Permite el uso de UPDATE.

USAGE Sinónimo de no privileges, permite únicamente la conexión al gestor.

GRANTOPTION Posibilita dar permisos.

49
Tema 10: Gestión de usuarios

Veamos algunos ejemplos de concesión de permisos:

• Si deseamos que el usuario ilerna@localhost solo pueda


seleccionar las columnas nombreCliente, apellido y direc-
ción, procederemos a ejecutar la siguiente sentencia:

Ejemplo

GRANT SELECT (Nombre, Apellido, Dirección) ON alumnos TO ilerna@localhost;


'/home/oracle/oradata/orcl/ejercicios.dbf 'SIZE 1000M autoextend on;

• Si deseamos otorgar permisos de select a todas las tablas


de todas las BBDD, permitiendo al usuario ceder esos
permisos a otros usuarios:

Ejemplo

GRANT SELECT ON *.* TO ilerna@localhost WITH GRANT OPTION;


'/home/oracle/oradata/orcl/ejercicios.dbf 'SIZE1000M autoextend on;

Nota: Esta sentencia solo es válida para MySQL.

Con esta instrucción damos el derecho indicado sobre la


tabla que señalemos al usuario citado. La última cláusula,
que es opcional, permite al usuario que se le conceda el
permiso y la posibilidad de ceder el permiso a otra persona.

El DBA (Data Base Administrator) tendrá todos los permi-


sos con la cláusula ALL, tanto para concederlos como para
revocarlos.

Ejemplo

REVOKE ALL PRIVILEGES ON*.*FROM ilerna@localhost

10.2.2.  Administración de privilegios en


MySQL
En MySQL podemos distinguir entre los siguientes privi-
legios:

• Privilegios de administrador: estos privilegios permiten


a un usuario realizar cualquier acción sobre el servidor
MySQL. Son privilegios de carácter global, es decir, no
atañen a una BD concreta.
• Privilegios de la BD: estos privilegios atañen a una BD
concreta, por tanto, permiten a un usuario realizar cam-
bios en la BD especificada.
• Privilegios para objetos: estos privilegios permiten al
usuario manipular tablas, vistas, índices y rutinas alma-
cenadas que haya en una BD.

50
Bases de datos - B

En MySQL, al igual que en otros SGBD, el comando para


asignar privilegios es GRANT y para eliminarlos es REVOKE.
Veamos la sintaxis simplificada del comando GRANT.

Sintaxis simplificada

GRANT tipo_privilegio ON [tipo_de_objeto]


nivel_de_privilegio TO usuario

A continuación, vamos a desglosar las opciones para cada


variable en esta sintaxis.

Tipos de privilegio
Los tipos de privilegios son múltiples. Podemos listar algu-
nos en la siguiente tabla:

Privilegio Significado

ALL [PRIVILEGES] Concede todos los privilegios a excepción de GRANT OPTION y PROXY.

ALTER Permite el uso de ALTER TABLE. A nivel global, de BD y de tabla.

ALTER ROUTINE Modificar o borrar rutinas almacenadas. A nivel global, de BD y de


rutina.

CREATE Permite crear tablas y BBDD. A nivel global, de BD y tabla.

CREATE ROLE Permite la creación de un ROL a nivel global.

CREATE ROUTINE Permite crear rutinas almacenadas a nivel global o de BD.

CREATE USER Permite el uso de CREATE USER, DROP USER, RENAME USER y REVOKE
ALL PRIVILEGES a nivel global.

CREATE VIEW Permite crear y modificar vistas. A nivel global, de BD o de tabla.

DELETE Permite el uso de DELETE. A nivel global, de BD o de tabla.

DROP Permite borrar BBDD, tablas o vistas. A nivel global, de BD o de tabla.

EXECUTE Permite al usuario ejecutar rutinas almacenadas. A nivel global, de


BBDD y de rutina.

FILE Permite al usuario leer o escribir archivos del servidor a nivel global.

GRANT OPTION Concede el privilegio de conceder o quitar privilegios a otros usuarios.


Niveles: global, BBDD, rutina, tabla y proxy.

51
Tema 10: Gestión de usuarios

INSERT Permite el uso del comando INSERT. A nivel global, de BD, de columna y
de tabla.

LOCK TABLES Permite el uso de LOCK TABLES en tablas para las que tenga el permiso
SELECT. A nivel global y de BD.

PROCESS Permite al usuario observar todos los procesos (SHOW PROCESSLIST) a


nivel global.

RELOAD Permite el uso de FLUSH a nivel global.

REFERENCES Permite al usuario la creación de claves ajenas. A nivel global, de BD, de


tabla y de columna.

SELECT Permite el uso de SELECT. A nivel global, de BD, de tabla y de columna.

SHOW DATABASES Permite ver todas las BBDD (SHOW DATABASES) a nivel global.

SHOW VIEW Permite el uso del SHOW CREATE VIEW. A nivel global, de BD y de tabla.

TRIGGER Permite las operaciones de disparadores (triggers). A nivel global, de BD


y de tabla.

UPDATE Permite el uso de UPDATE. A nivel global, de BD, de tabla y de


columna.

Nota: es posible consultar la tabla completa con todos los


tipos de privilegios en la documentación oficial de MySQL
vía web.

BUSCA EN LA WEB

dev.mysql.com/doc/refman/8.0/en/grant.
html#grant-privileges

Tipo de objeto
Los tipos de objetos sobre los que se les puede poner pri-
vilegios son:

Tabla (TABLE): refiere a las tablas de una BD


• Función (FUNCTION): es un bloque con nombre que pue-

52
Bases de datos - B

de estar almacenado en la BD y puede ser llamado para


ejecutar diferentes acciones.
• Procedimiento (PROCEDURE): es un bloque de instruc-
ciones que se pueden llamar por un nombre específico.

Nivel de privilegio
Los niveles de privilegio posibles son los siguientes:

Expresión El permiso se aplica a:

Nombre_tabla La tabla "Nombre_tabla".

* A todas las tablas de la BD en uso.

*.* Todas las tablas de todas las BBDD.

Base_datos.* Todas las tablas de la BD Base_datos.

Base_datos. Solamente a la tabla Nombre_tabla de la BBDD


Nombre_tabla Base_datos.

Tipo de usuario
Con el comando GRANT, los tipos de usuario que pueden
establecerse en la concesión de privilegios son:

• Nombre de una cuenta de usuario (USER)


• Nombre de un rol (ROLE)
Para finalizar, con TO y especificando el nombre de usuario,
se indica el permiso que se otorgará al usuario.

Un ejemplo de uso de concesión de privilegios a un usuario


podría ser el siguiente: si quisiéramos darle la opción a la
cuenta de usuario mrobinson, la opción de operar con los
comandos SELECT y INSERT en todos los objetos de la BD
de municipio, realizaríamos la siguiente sentencia:

Ejemplo

GRANT SELECT, INSERT ON municipio.*TO 'mrobinson'@'localhost';

Para eliminar los privilegios otorgados usamos el comando


REVOKE.

Ejemplo

REVOKE ALL ON municipio.* FROM 'mrobinson'@'localhost';

53
Tema 10: Gestión de usuarios

ponte a prueba

Un usuario de una BBDD posee una serie de


permisos y privilegios que nos indicarán qué
acciones pueden realizar dichos usuarios
dentro de la BBDD.
a) Verdadero
b) Falso

¿Cuáles de las siguientes opciones no es un


tipo de privilegios dentro de una BBDD?
a) GRANT OPTION
b) EXECUTE USER
c) INSERT
d) SELECT
e) ALL
f) DELETE

10.3.  Administración de roles


Un rol es un grupo de privilegios a los que se asigna un
nombre. El empleo de roles facilita la administración, de
forma que no hace falta especificar uno a uno los privilegios
que se conceden a cada nuevo usuario. Basta con asignarle
un rol para que herede todos los privilegios de este. Entre
sus principales características, podemos destacar:

• Se puede otorgar a cualquier usuario o rol, pero no a sí


mismo, ni de forma circular.
• Puede tener contraseña.
• Posee un nombre único en la BD.
• No forma parte de ningún esquema.

Trabajar con roles ofrece una serie de beneficios que, a


continuación, vamos a señalar:

• Simplifican el manejo de privilegios. Se pueden asignar


diferentes permisos a un rol y este también puede ser
asignado a distintos usuarios.

54
Bases de datos - B

• Maneja los privilegios de forma dinámica, es decir, si se


modifican los privilegios asociados al rol se actualizan di-
chos privilegios en todos los usuarios que lo posean de
manera inmediata.
• Disponibilidad selectiva de privilegios. Los roles asigna-
dos a un usuario pueden ser activados o desactivados
temporalmente y se pueden proteger con clave.
• El uso de roles disminuye el número de GRANT almace-
nados en el diccionario de datos, por lo que mejora la
productividad.

Oracle proporciona roles predefinidos para ayudar a la ad-


ministración de las BBDD. Son los siguientes:

• CONNECT: incluye únicamente el privilegio CREATE SES-


SION, que permite conectar a la BD. Si el usuario se crea
con OEM, este rol se asigna automáticamente.
• RESOURCE: incluye CREATE CLUSTER, CREATE INDEX-
TYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE

55
Tema 10: Gestión de usuarios

SEQUENCE, CREATE TABLE, CREATE TIGGER y CREATE TYPE.


Además, otorga el privilegio UNLIMITED TABLESPACE.
• DBA: incluye todos los privilegios del sistema mediante
la opción WITH ADMIN OPTION.
– No incluye arrancar o parar la BD.
– SYS y SYSTEM lo poseen.
Las definiciones de los roles están almacenadas en el
diccionario de datos. Normalmente se crea un rol y a pos-
teriori se le asignan privilegios. Así, el grupo de usuarios
pertenecientes a este rol adoptan sus privilegios.

Veamos un ejemplo en el que primero nos creamos un rol


y, a continuación, le asignamos permisos para que estos los
adquieran un grupo de usuarios.

Ejemplo

CREATE ROLE rol_ilerna;


GRANT CREATE ANYTABLE,
DROP TABLE,
INSERT ON Alumnos TO rol_ilerna;
GRANT rol_ilerna TO ilerna;

ponte a prueba

Los roles son grupos de privilegios que se


definen en el usuario de forma directa, ya
que estos no pueden ser almacenados en la
BBDD.
a) Verdadero.
b) Falso.

¿Cuál de las siguientes opciones no es un


beneficio de trabajar con roles?
a) Se disminuye el número de GRANT que están
almacenados en el diccionario de datos.
b) E
 s posible activar o desactivar los roles de un
usuario.
c) Un rol solamente puede abarcar un tipo de
permiso.
d) E
 s posible aplicar un mismo rol a diferentes
usuarios.

56
Bases de datos - B

10.4.  Administración de perfiles


Los perfiles no se manejan en todos los sistemas gestores
de BBDD. En el caso de Oracle, sí. En el de MySQL también,
pero solo en versiones anteriores, porque en las últimas
han caído en desuso.

Los perfiles definen un conjunto de límites de recursos


de la BD y del sistema operativo para los distintos usuarios.
Existe un perfil por defecto llamado DEFAULT que tiene
todos los recursos asignados con valor UNLIMITED. Este
perfil se asigna por defecto, a no ser que se especifique
uno distinto. Cada usuario tiene únicamente un perfil en
un instante de tiempo determinado.

Necesita el privilegio del sistema CREATE PROFILE, cuya


sintaxis es:

Sintaxis

CREATE PROFILE <nombrePerfil> LIMIT


<parámetro 1><valor>|UNLIMITED|DEFAULT
<parámetro N><valor>|UNLIMITED|DEFAULT;

En la posición de parámetro podemos asignar parámetros


sobre recursos o parámetros sobre la contraseña. Algunos
de los parámetros que podemos determinar sobre los re-
cursos son:

• SESSIONS_PER_USER: se determina cuántas sesiones


simultáneas activas puede tener un perfil, como máximo.
• CPU_PER_SESSION: se determina el máximo de tiempo
de CPU para una sesión. Se expresa en centésimas de se-
gundo.
• CPU_PER_CALL: se determina un tiempo límite de res-
puesta para realizar una llamada (en centésimas de
segundo).
• CONNECT_TIME: se determina el tiempo máximo que
puede estar activa una sesión. Se expresa en minutos.
• IDLE_TIME: Se determina el tiempo máximo de inacti-
vidad en una sesión (minutos).
• LOGICAL_READS_PER_SESSION: Determina el número
máximo de bloques de datos leídos en una determinada
sesión.
• LOGICAL_READS_PER_CALL: Determina el número
máximo de bloques leídos en una llamada.

57
Tema 10: Gestión de usuarios

Algunos de los parámetros que podemos determinar sobre


los recursos son los siguientes:

• FAILED_LOGIN_ATTEMPTS: determina el número de


intentos fallidos para iniciar sesión en una cuenta. Si se
supera la cuenta se bloqueará. Por defecto el valor es de
10 intentos
• PASSWORD_LIFE_TIME: determina el número de días
que una contraseña puede ser usada para iniciar sesión.
Por defecto son 180 días
En la posición de valor pondremos el valor del parámetro
que hayamos asignado.

Se asigna el valor UNLIMITED si es un parámetro de recur-


so que se puede usar una cantidad de veces ilimitada. Esto
suele darse en el caso de parámetros que tienen asignada
una contraseña que no ha fijado límites. En cambio, el valor
DEFAULT se utiliza cuando queremos omitir algún pará-
metro asignado a un usuario por defecto.

10.5.  Normativa legal vigente


sobre la protección de datos
La Ley Orgánica 3/2018, de 5 de diciembre, de Protec-
ción de Datos Personales y garantía de los derechos
digitales tiene como objetivo garantizar y proteger en
todo lo relativo a los datos personales, las libertades pú-
blicas y los derechos fundamentales de las personas físicas
y especialmente su honor, intimidad y privacidad personal
y familiar.

Regula el tratamiento que se realiza de los datos de ca-


rácter personal, excluyendo los datos recogidos para uso
doméstico, las materias clasificadas del estado y aquellos
ficheros que recogen datos clasificados sobre terrorismo y
otras formas de delincuencia organizada.

En el ámbito estatal, la organización encargada del cum-


plimiento de dicha orden es la Agencia Española de
Protección de Datos (AEPD).

BUSCA EN LA WEB

En el siguiente enlace podemos acceder al BOE


para descargarnos dicha ley y poder estudiarla más
detenidamente: Ley Orgánica de Protección de Datos
(LOPD).

https://www.boe.es/eli/es/lo/2018/12/05/3

58
Bases de datos - B

59
11 PROGRAMACIÓN EN BASES DE DATOS

(BBDD)
Bases de datos - B

Cuando hablamos de programación en BBDD, debemos


nombrar PL/SQL (Procedural Language/ Structure Query
Language) que es el lenguaje procesal diseñado para poder
trabajar junto con SQL. Está incluido en Oracle Database
Server. A continuación, detallaremos sus principales ca- ponte a prueba
racterísticas:
• Integrado con SQL ¿Cuál de las siguientes
• Control de errores y excepciones características no nos aporta
el lenguaje PL/SQL?
• Uso de variables
a) Uso de variables
• Estructuras de control de flujo
b) P
 ermite una programación
• Soporta programación orientada a objetos (POO) con funciones
• Programación modular: procedimientos y funciones. c) Trabaja integrado con SQL
d) N
 o trabaja con estructuras de
control de flujo
11.1.  Entornos de desarrollo al
entorno de las BBDD
En informática, un intérprete de comandos es una aplicación
que dispone de una interfaz de usuario a través de la cual
es posible enviar órdenes al sistema. Los intérpretes de co-
mandos tienen una sintaxis establecida que el usuario debe
conocer para poder gestionar dichas órdenes al sistema.

Los SGBD también poseen su propio intérprete de coman-


dos, por los que se pueden enviar consultas al servidor y los
resultados son mostrados por la misma pantalla del propio
intérprete.

Por ende, tanto Oracle como MySQL también tienen sus


propios intérpretes de comandos. En el caso de Oracle
disponemos de Oracle SQL * Plus y en MySQL nos ofrece
MySQL Command Line Client.

Respecto a SQL * Plus, es posible invocarlo desde el sistema


operativo, ejecutando el siguiente comando:

Sintaxis

Sqlplus [{usuario[/password][@database] | /
|/nolog }] [AS {SYSDBA | SYSOPER}]

Intérprete de comandos Oracle SQL * Plus.


61
Tema 11: Programación en bases de datos (BBDD)

Por otro lado, en MySQL disponemos de MySQL Command


Line, el cual tiene un comando de ayuda muy útil, help,
que nos lista aquellos comandos que el mismo intérprete
ejecuta por sí mismo. Es decir, comandos auxiliares de la
aplicación, independientemente del servidor. Son útiles
para salir del intérprete, cambiar de BD, ejecutar un script
y otras funciones.

Intérprete de comandos de MySQL.

62
Bases de datos - B

11.2.  Sintaxis del lenguaje de


programación

11.2.1.  Bloques en PL/SQL


Los bloques son la forma más básica de programar en PL/
SQL. Son fragmentos de código que no se almacenan en
la estructura de la BD y para ejecutarlo solo es necesario
introducirlos en la consola como si se tratase de SQL. Un
bloque lógico está estructurado en tres partes:
1. Parte de declaraciones (opcional): declararemos to-
das las variables, constantes, cursores y excepciones
definidas por el usuario.
2. Parte ejecutable (requerida): podremos hacer uso de
las sentencias de control que ofrecen los lenguajes de
programación:
◦ Secuencias, órdenes del lenguaje, asignaciones,
llamadas a funciones o procedimientos, etc. Se colo-
carán una detrás de otra y las separaremos con punto
y coma (;).
◦ La iteración o bucle repetirá una sentencia o secuen-
cia de sentencias mientras se cumpla o hasta que deje
de cumplirse una condición.
3. Parte de tratamiento de excepciones (opcional):
bloque opcional de código donde podremos tratar los
posibles errores que genere la parte ejecutable del
código.

-- Sintaxis
[DECLARE ]
-- declaraciones de objetos (variables, cursores, excepciones definidas
-- por el usuario)]
BEGIN/*comienza la parte ejecutable*/
-- comandos y sentencias SQL y PL/SQL
[EXCEPTION/*comienza la parte de tratamiento de excepciones */
-- acciones para realizar cuando se producen errores]
END;
/ -- fin de sentencia en consola de comandos

En el caso de estar ejecutando el código por la conso-


la de SQL, el símbolo / nos cierra el bloque de código
y este se ejecuta. En caso de no ponerlo, la consola se
queda esperando más líneas de código.

Este símbolo también lo utilizaremos en el caso de


lanzar dos bloques distintos de código en el SQL
Developer. Por ejemplo, al lanzar dos creates juntos
tendríamos que separar los bloques ejecutables con
el símbolo /.

63
Tema 11: Programación en bases de datos (BBDD)

Un bloque PL/SQL puede ser un bloque anónimo, un


procedimiento o una función. El objetivo de diseño PL/
SQL es conseguir modularidad, es decir, simplificar la
complejidad del problema dividiéndolo en problemas más
sencillos y fáciles de implementar. Para ello se utilizan pro-
cedimientos y funciones.

11.2.2.  Variables
Al igual que en otros los lenguajes de programación, los
lenguajes diseñados para las BBDD también usan variables.
Las variables reservan en la memoria un espacio para asig-
nar valores concretos y se caracterizan por tener un tipo de
información determinado como pueden ser una fecha, una
cadena de texto, un valor numérico, etc.

Variables en PL/SQL

En cuanto al uso, las variables se declaran y se pueden


inicializar en la sección declarativa de un bloque PL/SQL.
Permite pasar valores a un subprograma PL/SQL mediante
parámetros. Existen tres formas:

• IN: el valor viene del proceso de llamada. Es un dato de


entrada y su valor no se cambia. Es el valor por defecto

64
Bases de datos - B

• OUT: en una salida de programa sin error, el valor del ar-


gumento devuelve al proceso de llamada.
• IN OUT: es una variable de entrada/salida.
La sintaxis para la declaración de variables es:

Sintaxis

nombre_variable[CONSTANT] tipo_dato
[NOTNULL][:=|DEFAULT|expresión ];

CONSTANT declara la variable como constante. Su valor no


puede cambiar. Debe ser inicializada.

Los tipos de datos de las variables PL/SQL son:

• Compuesto: los tipos compuestos son las tablas, regis-


tros, tablas anidadas y arrays.
• LOB: los tipos de datos LOB permiten almacenar bloques
de datos no estructurados como gráficos, imágenes, ví-
deos y texto de hasta cuatro gigabytes de tamaño.
Escalar:

Tipo

BINARY-INTEGER Almacena enteros con signo.

Subtipos: NATURAL, POSITIVO

NUMBER[(precisión, escala)] Almacena números con punto fijo o flotante.

CHAR[(longitud, máxima)] Almacena cadenas de caracteres de longitud fija.

VARCHAR2(longitud, máxima) Almacena cadenas de caracteres de longitud variable.

LONG Almacena cadenas de caracteres de longitud variable,


tamaño máximo 2 Gb.

RAW Almacena objetos binarios.

LONG RAW Almacena objetos binarios de hasta 2 Gb.

BOOLEAN Almacena TRUE, FALSE o NULL.

DATE Almacena valores de fecha.

ROWID Dirección física de una fila de la BDD.

Existen otras variables que no son PL/SQL y podemos cla-


sificar en:
• Variables BIND
• Variables HOST

65
Tema 11: Programación en bases de datos (BBDD)

Variables en MySQL

En MySQL debemos diferenciar bien entre las palabras


clave y las variables. Una palabra clave (keyword) es una
palabra que ya posee un significado predefinido en MySQL,
como pueden ser BEGIN, SELECT, CREATE, etcétera.

Además, las keyword pueden ser reservadas o no. La di-


ferencia entre el manejo de una palabra clave reservada y
una que no lo es pasa por tener que poner comillas en el
caso de que sea reservada. De tal modo que, si en MySQL
queremos crear una tabla con una palabra reservada escri-
biremos lo siguiente:

Ejemplo

CREATE TABLE select (id INT, comentario VARCHAR(100));

La sentencia nos dará error y nos aparecerá el siguiente


mensaje:

MENSAJE de ERROR

ERROR 1064 You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to
use near 'select (id INT, comentario VARCHAR(100))' at line 1

Sin embargo, al utilizar las comillas simples el sistema eje-


cuta la sentencia perfectamente:

Ejemplo

CREATE TABLE `select` (id INT, comentario VARCHAR(100));

Por otro lado, en MySQL tenemos las variables de usuario,


que pueden emplearse para guardar determinados valores
y utilizarlos posteriormente. La sintaxis para declarar una
variable es la siguiente:

Sintaxis

SET @nombre_de_variable= expresión;

Por ejemplo, vamos a establecer que la variable mínimo


tiene un valor de un millón (1000000):

Ejemplo

SET @minimo =1000000;

66
Bases de datos - B

De este modo, si tuviéramos una tabla llamada población


con la siguiente información:

id nombre cantidad

1 valencia 850000

2 madrid 3500000

2 barcelona 2000000

Resultado de una sentencia select en el entorno Workbench.

Para mostrar solo las ciudades que tienen un mínimo de


población de un millón de habitantes, podríamos utilizar la
variable mínimo anteriormente declarada:

Ejemplo

SELECT * FROM población WHERE cantidad > @minimo;

Y nos devolvería lo siguiente:

id nombre cantidad

2 madrid 3500000

2 barcelona 2000000

Resultado de una sentencia select en el entorno Workbench.

11.2.3.  wOperadores
Los operadores sirven para relacionar variables entre sí,
cuya combinación dará lugar a expresiones aportando re-
sultados. Siendo de esta forma un fundamento de la lógica
en la programación de BBDD. Las operaciones que se pue-
den realizar son las siguientes:

OPERADOR ACCIÓN

** Potencia

+ - (unarios) Signo positivo o negativo

* Multiplicación
/ División

67
Tema 11: Programación en bases de datos (BBDD)

+ Suma
- Resta
|| Concatenar cadenas

=, <, >, <= Comparaciones: igual, menor que,


>=,<>, != mayor que, menor o igual que,
mayor o igual que, distinto que,
IS NULL, LIKE
distinto que
BETWEEN, IN
Es nulo, como
Entre, en

NOT Negación lógica de un booleano


AND Operador AND lógico entre tipos de
datos booleanos
OR
Operador OR lógico entre tipos de
datos booleanos

A continuación, se muestra una tabla con ejemplos de


expresiones verdaderas (TRUE) utilizando los operadores
anteriores:

(3 + 5) / 2 = 4 6+4/2=5

5 != 3 0 <> NULL

5 IS NOT NULL == TRUE 5 BETWEEN 2 AND 10

'Alumno' LIKE '%u%' 6 IN (2,4,6)

'a' NOT IN ('d','e') (1<4) AND (5>=5)

En la programación estructurada se debe hacer uso de dis-


tintos tipos de estructuras de control. Las describiremos
a continuación.

• Selección: este tipo de estructuras ejecutan un conjunto


de instrucciones dependiendo de si se cumple o no una
determinada condición.
• Sentencia IF: evalúa una expresión y en función de si el
valor de esta es verdadero o falso se ejecutan unas ins-
trucciones u otras.

68
Bases de datos - B

Sintaxis

IF condición THEN
instrucciones;
[ELSIF condición THEN
instrucciones;]
[ELSE
instrucciones;]
END IF;
/

Nota: el contenido de la sintaxis que está entre corchetes


[…] indica que es opcional incluirlo en el código. Por tanto,
no es obligatorio poner ELSE o ELSIF en una sentencia IF.

Ejemplo

IF dept = 'Administración' THEN


numero := numero * 2;
ELSIF dept = 'Secretaría' THEN
numero := numero * 1.5;
ELSE
numero := numero * 1.1;
END IF;

• Sentencia CASE: evalúa un conjunto de condiciones


hasta encontrar alguna que se cumpla y ejecuta las ins-
trucciones que esta tiene asociadas.

Sintaxis

CASE [expresión]
WHEN {condición1|valor1 } THEN
bloque_instrucciones_1
WHEN {condición2|valor2 } THEN
bloque_instrucciones_2
ELSE
bloque_instrucciones_por_defecto
END CASE:
/

Ejemplo

SELECT Nombre, CASE EC


WHEN 'C' THEN 'Casado/a'
WHEN 'S' THEN 'Soltero/a'
WHEN 'D' THEN 'Divorciado/a'
ELSE 'Otros'
END
AS "Estado civil"
FROM Empleados;

69
Tema 11: Programación en bases de datos (BBDD)

• Iteración: consiste en la repetición de un conjunto de


instrucciones un número determinado de veces. A con-
tinuación, se describen distintos tipos de estructuras de
iteración.
– Estructura repetitiva básica:

Sintaxis

LOOP
sentencias;
END LOOP;
/

EJEMPLO

En estos ejemplos de bucles vamos a utilizar


la sentencia dbms_output.put_line para ver
los valores de la variable cont por pantalla, de
tal forma que nos ayude a entender mejor las
condiciones de salida de los bucles. Para que
esta sentencia funcione correctamente tenemos
que lanzar la sentencia SET SERVEROUTPUT
ON, que activa el visionado de los mensajes por
consola.

Estas sentencias vienen explicadas en el punto


4.5 de cursores y transacciones en el apartado de
Herramientas de depuración y control de código.

En esta unidad formativa también encontraremos


algunas funciones de Oracle, las cuales harán
referencia a la fecha, al identificador de la fila,
etc.

Por ejemplo: Sysdate: fecha diaria


Rowid: identificador de la fila
User: usuario del sistema de BD
NLS_Session_Parameters: parámetros de
sesión
DUAL: tabla del sistema donde encontramos la
fecha y otros parámetros

Este bucle estará repitiéndose infinitamente, ya que no


existe ninguna condición que permita salir de él. Es conve-
niente evaluar si dentro del bucle existe alguna condición
que provoque la salida de este. Podemos realizarlo de dos
formas:

70
Bases de datos - B

1. Usando WHEN: saliéndonos del bucle cuando se cum-


pla cierta condición, mediante la cláusula EXIT.

Ejemplo

SET SERVEROUTPUT ON;


DECLARE
CONT INT:=0;
BEGIN
LOOP
CONT:=CONT+1;
EXIT WHEN CONT>=10;
END LOOP;
END;
/

2. Usando IF: forzando a salir de la iteración mediante


EXIT.

Ejemplo

SET SERVEROUTPUT ON;


DECLARE
CONT INT :=0;
BEGIN
LOOP
CONT :=CONT +1;
IF CONT >=10 THEN
EXIT;
END IF;
END LOOP;
/

◦ Esquema WHILE

Sintaxis

WHILE condición LOOP


instrucciones;
END LOOP;
/

◦ Esquema FOR: este bucle solo lo podemos usar


cuando conocemos de antemano el número de repe-
ticiones o iteraciones que queremos realizar.

Sintaxis

FOR índice IN[REVERSE] valor_inicial .. valor_final


LOOP
instrucciones;
END LOOP;
/

71
Tema 11: Programación en bases de datos (BBDD)

En este caso:
• Índice no hace falta declararlo ya que lo hace implícita-
mente al usar la estructura FOR, pero no se puede usar
fuera de ella.
• REVERSE recorre el bucle en sentido inverso, es decir, va
decrementando el valor de índice.

Vamos a ver algunos ejemplos muy sencillos de cómo utili-


zar las sentencias de iteración que acabamos de ver:

Ejemplo de iteración WHILE Ejemplo de iteración FOR

SET SERVEROUTPUT ON; SET SERVEROUTPUT ON;


DECLARE DECLARE
cont INTEGER :=0; cont INTEGER :=0;
fin BOOLEAN :=TRUE; calc INTEGER :=0;
BEGIN BEGIN
WHILE fin LOOP FOR cont IN 0 .. 5
cont := cont + 1; LOOP
dbms_output.put_line(cont); calc := cont * 5;
IF cont>=5 THEN dbms_output.put_line(calc);
fin := FALSE; END LOOP;
cont :=0; END;
END IF; /
END LOOP;
END;
/

ponte a prueba

¿En qué parte del código podemos ¿Cuál de las siguientes opciones es
declarar una expresión que utilice válida como tipo de una variable
un IF? dentro de un entorno de BBDD?
a) Parte de declaraciones. a) DATE, INTEGER y CHAR.
b) Parte ejecutable. b) SYSTEM, DATE y CHAR.
c) Parte de tratamiento de c) WINDS, CHAR y SYSTEM.
excepciones. d) Ninguna opción es correcta.
d) B y C son correctas.

72
Bases de datos - B

11.3.  Procedimientos y funciones


Los procedimientos y funciones son herramientas que
poseen lenguajes de BBDD como PL/SQL o MySQL y nos
permiten reutilizar un código determinado todas las
veces que necesitemos utilizarlo.

La definición de un procedimiento o función tienen dos


partes:

• Especificación: se declara el nombre del subprograma.


Esta declaración está formada por el nombre y los tipos
de los argumentos. Si hablamos de funciones y, solo en
este caso, también se indicará el valor devuelto.
• Cuerpo: formado por sentencias PL/SQL que realizarán el
objetivo para el cual se creó el procedimiento o la función.

Procedimientos en PL/SQL

Los procedimientos en PL/SQL están formados por un con-


junto de sentencias que se van a ejecutar cada vez que el
procedimiento se invoque, por ejemplo, desde un bloque.
Cuando un procedimiento es creado se compilará y se al-
macenará en la BD para su posterior invocación.

A continuación mostramos la sintaxis de un procedimiento


en PL/SQL:

Sintaxis

CREATE [ORREPLACE] PROCEDURE [esquema ].nombre_procedure


(nombre_parametro{IN|OUT|INOUT}tipo_de_dato,…)
{IS|AS}
declaraciones_de_variables;
declaraciones_de_constantes;
declaraciones_de_cursores;
BEGIN
cuerpo_del_subprograma;
[EXCEPTION
bloque_de_excepciones; ]
END;
/

En este caso:

• CREATE [OR REPLACE] PROCEDURE crea el procedi-


miento. Si se usa REPLACE se asegura que, si existiera ya
ese procedimiento, lo reemplace o sustituya.
• nombre_procedure indica el nombre del procedimiento.
• Parámetro formal: nombre del parámetro definido en la
función, donde funcionan como variables locales con la
particularidad de que se inician con el valor que tengan
los parámetros actuales en el momento de llamarlo.

73
Tema 11: Programación en bases de datos (BBDD)

• Parámetro actual: son los valores que tienen los pará-


metros cuando se llama a la función. Es el valor que se
asignan en la invocación a los parámetros formales.
• Parámetros para utilizar en la ejecución del procedi-
miento:
– IN: valor por defecto. El parámetro es de entrada. Cual-
quier modificación realizada en el procedimiento no
afectará a su valor fuera del procedimiento. El paráme-
tro actual no puede cambiar.
– OUT: el parámetro es de salida, es decir, en el procedi-
miento se le va a asignar un valor y este va a afectar al
parámetro actual, pero no sirve para pasar un valor al
procedimiento a través del parámetro formal.
– IN OUT: el parámetro se usa tanto para entrada como
para salida.
– IS | AS: no existe diferencia entre las dos, podemos po-
ner la que deseemos.
– Declaraciones de variables, constantes y cursores.
– Entre BEGIN y END escribiremos el cuerpo del procedi-
miento.

Procedimientos en MySQL

Al igual que en PL/SQL, un procedimiento en MySQL está


formado por una declaración y un cuerpo que contiene
sentencias SQL. El procedimiento puede ser invocado tan-
tas veces como sea necesario.

Los procedimientos suelen ser muy útiles, ya no solo por la


posibilidad de reutilización y, por tanto, eficiencia en el có-
digo, sino por la seguridad que ofrecen. Un procedimiento
permite modificar de manera controlada una información
sensible en la BD a usuarios que en principio tienen pocos
privilegios. De este modo, los usuarios podrán ejecutar di-
chas sentencias, pero no podrán modificarlas.

A continuación mostramos la sintaxis de un procedimiento


en MySQL:

Sintaxis

CREATE PROCEDURE
nombreProc( [IN | OUT | INOUT] nombre_parametro, tipo)
[características]
BEGIN
Sentencias SQL;
END;

74
Bases de datos - B

En este caso:

• CREATE PROCEDURE crea el procedimiento.


• nombreProc es el nombre del procedimiento.
• nombreParam es el nombre que damos al parámetro de
entrada.
• Las características son opcionales.
• tipo es el tipo de dato del parámetro de entrada.
• Entre BEGIN y END escribiremos el cuerpo del procedi-
miento.

Veamos un ejemplo:

Ejemplo

DELIMITER $$
CREATE PROCEDURE mostrar_poblacion (IN codigo INT)
BEGIN
SELECT * FROM poblacion WHERE id = codigo;
END$$

La sentencia DELIMITER se utiliza para cambiar el punto


y coma (;) como delimitador de sentencia, de modo que
podamos enviar al servidor toda la definición como una
sola sentencia. Para llamar al procedimiento utilizamos el
comando CALL:

Ejemplo

CALL $$mostrar población (3);

75
Tema 11: Programación en bases de datos (BBDD)

Funciones

Una función está formada por un conjunto de sentencias


que se van a ejecutar cada vez que esta se invoque. Esta
definición coincide con la de procedimiento, ¿en qué se
diferencian? La función va a devolver siempre un resultado
que será un tipo de datos concreto que ha sido definido en
su declaración.

Para devolver dicho valor se usará la palabra reservada


RETURN. Así, deberá aparecer al menos una vez a lo largo
del código.

Sintaxis

CREATE [ OR REPLACE ] FUNCTION [ esquema


].nombre_función
( nombre_parámetro tipo_de_dato, … )
RETURN tipo_de_dato
{ IS | AS }
declaraciones_de_variables;
declaraciones_de_constantes;
declaraciones_de_cursores;
BEGIN
cuerpo_del_subprograma;
[ EXCEPTION
bloque_de_excepciones;]
END;
/

En este caso:

• Tipo_de_dato: indicaremos el tipo de dato que se va a


devolver. Podemos realizar la llamada a los procedimien-
tos o funciones que hemos creado de varias formas.

Sintaxis

EXECUTE nombre_procedimiento;
CALL nombre_procedimiento();
--Podemos ejecutar el procedimiento dentro
de un bloque
BEGIN
nombre_procedimiento [ (Parametros) ];
END;
/

A continuación, vamos a ver unos ejemplos para ilustrar el


trabajo con procedimientos y funciones.

76
Bases de datos - B

Ejemplo

SET SERVEROUTPUT ON;


CREATE OR REPLACE PROCEDURE mensaje
IS
BEGIN
dbms_output.put_line ('¿Cómo estás? Este es un mensaje de prueba');
END;
/
-- Para ejecutar el procedimiento
EXECUTE mensaje;

Ejemplo

SET SERVER OUTPUT ON;


CREATE OR REPLACE PROCEDURE duplicarentero (num IN OUT INT)
AS
BEGIN
num := 2 * num;
END;
-- Para ejecutar el procedimiento

DECLARE
i INT:= 5;
BEGIN
duplicarentero(i);
dbms_output.put_line(i);
END;

Ejemplo

CREATE OR REPLACE FUNCTION paridad (entero INT)


RETURN VARCHAR2 --Devuelve si el número proporcionado es par o no
IS
esPar VARCHAR2(15);
BEGIN
IF MOD(entero, 2) = 0 THEN
espar := 'Es par';
ELSE
esPar :='No es par';
END IF;

return(espar);
END;
-- Para ejecutar el procedimiento

BEGIN
dbms_output.put_line(paridad(1));
END;
77
Tema 11: Programación en bases de datos (BBDD)

Ejemplo

CREATE OR REPLACE FUNCTION unm2mes(unm INT)


RETURN VARCHAR2–Devuelve el mes
IS
mes VARCHAR2(20);
BEGIN
CASE num
WHEN 1 THEN mes :='Enero';
WHEN 2 THEN mes :='Febrero';
WHEN 3 THEN mes :='Marzo';
WHEN 4 THEN mes :='Abril';
WHEN 5 THEN mes :='Mayo';
WHEN 6 THEN mes :='Junio';
WHEN 7 THEN mes :='Julio';
WHEN 8 THEN mes :='Agosto';
WHEN 9 THEN mes :='Septiembre';
WHEN 10 THEN mes :='Octubre';
WHEN 11 THEN mes :='Noviembre';
WHEN 12 THEN mes :='Diciembre';
ELSE mes :='Error';
END CASE;
RETURN(mes);
END;
/

78
Bases de datos - B

ponte a prueba

¿Qué opción tendríamos que indicar a un


parámetro para que sea solo de entrada?
a) IN
b) OUT
c) IN/OUT
d) No es necesario indicar el tipo del parámetro

Las funciones y los procesos son lo mismo,


realizan las mismas acciones y permiten
ejecutarse al mismo nivel dentro de una base
de datos, aunque los procesos son más utili-
zados, ya que las funciones son elementos
obsoletos.
a) Verdadero
b) Falso

11.4.  Control de errores


Una excepción es el resultado que se obtiene tras ejecutar
un bloque PL/SQL que posee un error. La llamada al trata-
miento de excepciones puede producirse de dos formas:

• Ocurre un error y la excepción se lanza de forma auto-


mática.
La lanzamos nosotros de forma explícita usando la sen-
tencia RAISE.

Sintaxis

EXCEPTION
WHEN exception1 [ or exception2 … ]THEN
sentencias_para_ejecutar;
WHEN exception3 [ or exception4 … ]THEN
sentencias_para_ejecutar;
WHEN OTHERS THEN
sentencias_para_ejecutar;
END;
/

79
Tema 11: Programación en bases de datos (BBDD)

Tipos

Podemos clasificarlas en:

• Excepciones Oracle predefinidas: Oracle las lanza de


forma automática. Son excepciones estándar predefini-
das a las que se ha dado nombre.

Nombre Descripción

NO_DATA_FOUND La sentencia SELECT no devuelve ningún valor.

TOO_MANY_ROWS La sentencia SELECT devuelve más de una fila.

INVALID_CURSOR Se está haciendo referencia a un cursor no válido.

ZERO_DIVIDE Se está intentando realizar una división de un


número entre cero.

CASE_NOT_FOUND Ninguna de las condiciones de la sentencia WHEN


en la estructura CASE se corresponde con el valor
evaluado y no existe cláusula ELSE.

CURSOR_ALREADY_OPEN El cursor que intenta abrirse ya está abierto.

INVALID_NUMBER La conversión de una cadena a valor numérico no


es posible porque la cadena no representa un valor
VALUE_ERROR numérico válido.

VALUE_ERROR Error ocurrido en alguna operación aritmética, de


conversión o trucado.

LOGIN_DENIED Un programa está intentado acceder a la BD con un


usuario o password incorrecto.

NOT_LOGGED_ON Un programa está intentado ejecutar una acción


en la BD sin haber formalizado previamente la
conexión.

TIMEOUT_ON_RESOURCE Se ha acabado el tiempo que el SGBD pude esperar


por algún recurso.

OTHERS Es la opción por defecto. Interceptará todos los


errores no tenidos en cuenta en las condiciones
WHEN anteriores.

80
Bases de datos - B

Por ejemplo:

Ejemplo

DECLARE
identificador NUMBER;
BEGIN
SELECT nombre INTO identificador
FROM Alumno
WHERE cod = 100;
EXCEPTION
WHEN NO_DATA_FOUND OR TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE ('El error es: '|| SQLCODE );
DBMS_OUTPUT.PUT_LINE ( SQLERRM );
END;
/

• Excepciones Oracle NO-predefinidas: si se declaran en


la sección declarativa pueden ser tratadas por Oracle de
forma automática. Se debe definir el código Oracle aso-
ciado a esa excepción numérica. Para ello se utiliza la
sentencia PRAGMA EXCEPTION_INIT.

Si estamos utilizando programas como SQL Develo-


per, hay que tener en cuenta que, cuando tenemos
un error en el código, este nos muestra en la
consola el código del error, ya que hay tal cantidad
de errores que memorizarlos es imposible.

Ejemplo

DECLARE
fecha_incorrecta EXCEPTION;
PRAGMA EXCEPTION_INIT (fecha_incorrecta,-01847);
fecha DATE;
BEGIN
fecha:=TO_DATE('32-12-2017');
dbms_output.put_line(fecha);
EXCEPTION
WHEN fecha_incorrecta THEN
dbms_output.put_line('La fecha introducida es incorrecta');
END;
/

• Errores definidos por el usuario: no tienen relación


con Oracle. Son condiciones que se determina que son
errores. Se declaran en la sección declarativa, pero es
necesario tratarlas de forma explícita. Se lanza con la
sentencia RIASE:

81
Tema 11: Programación en bases de datos (BBDD)

Ejemplo

DECLARE
negativo EXCEPTION;
valor NUMBER;
BEGIN
valor:= -1;
IF valor< 0 THEN
RAISE negativo;
END IF;
EXCEPTION
WHEN negativo THEN
dbms_output.put_line ('Números negativos NO permitidos');
END;
/

ponte a prueba

¿En qué parte del código podemos declarar


un error definido por el usuario?
a) Parte de declaraciones
b) Parte ejecutable
c) Parte de tratamiento de excepciones
d) En cualquiera de las partes que podemos
encontrar en el código

¿Cuáles de las siguientes opciones son


excepciones conocidas por el sistema?
a) NO_DATA_FOUND
b) TOO_MANY_ROWS
c) CERODIVIDE
d) CASE_FOUND
e) A y B son correctas

No podemos generar excepciones propias,


siempre que queramos controlar excepciones
tendremos que utilizar las definidas por
defecto por el sistema gestor de BBDD.
a) Verdadero
b) Falso

82
Bases de datos - B

11.5.  Cursores y transacciones

Cursores
https://youtu.be/Wl5Hix5LNXE

Los cursores son las diferentes estructuras que nos per-


miten recorrer la salida de una consulta realizada. PL/SQL
utiliza cursores para gestionar las diferentes instrucciones
SELECT. Recordemos que un cursor es un conjunto de re-
gistros devuelto por una instrucción SQL. Una definición
más técnica para los cursores podría hacer referencia a los
fragmentos de memoria que tenemos reservados para pro-
cesar los resultados de una consulta SELECT.

Debemos señalar los dos tipos de cursores que podemos


tener:

• Implícitos: utilizados para operaciones SELECT INTO. Va-


mos a hacer uso de ellos cuando la consulta devuelve un
único registro
• Explícitos: estos son declarados y controlados por el pro-
gramador cuando una consulta devuelve un conjunto de
registros. Aunque, algunas veces, se utilizan en consultas
que devuelven un único registro por razones de eficien-
cia. Son más rápidos

83
Tema 11: Programación en bases de datos (BBDD)

Definimos los cursores de la misma forma que si fuera una


variable de PL/SQL. Aunque también es cierto que los cur-
sores implícitos no necesitan declaración.

Los cursores explícitos son necesarios cuando vamos a


procesar instrucciones SELECT que devuelven más de una
fila y/o atributos. En este caso, irán combinados con una
estructura de bloque.

Los cursores, además, pueden utilizar parámetros que se


declaran junto con el cursor.

• Cursores implícitos: los cursores implícitos se utilizan


para realizar consultas SELECT que devuelven un único
registro. Para utilizarlos, debemos tener en cuenta:
– Con cada cursor implícito debe existir la palabra clave
INTO.
– Las variables que reciben los datos devueltos por el
cursor tienen que contener el mismo tipo de dato que
las columnas de la tabla.
– Los cursores implícitos solo pueden devolver una única
fila. En caso de que se devuelva más de una fila (o nin-
guna fila) se producirá una excepción. Por medio de PL/
SQL gestionaremos los errores.

El siguiente ejemplo muestra un cursor implícito:

Ejemplo

SET SERVEROUTPUT ON;


DECLARE
vnombre VARCHAR2(50);
BEGIN
SELECT nombre INTO vnombre FROM Alumno WHERE codigo=14;
DBMS_OUTPUT.PUT_LINE('El nombre del alumno es : ' || vnombre);
END;
/

La salida del programa generaría la siguiente línea:

El nombre del alumno es: Juan.

• Excepciones asociadas a los cursores implícitos: los


cursores implícitos solo pueden devolver una fila, por lo
que pueden producirse determinadas excepciones. Las
más comunes que se pueden encontrar son no_data_
foundy too_many_rows.
La siguiente tabla explica brevemente estas excepciones:

84
Bases de datos - B

Excepción Explicación

NO_DATA_FOUND Se produce cuando una sentencia SELECT intenta recuperar


datos, pero ninguna fila satisface sus condiciones. Es decir,
cuando no hay datos.

TOO_MANY_ROWS Dado que cada cursor implícito solo es capaz de recuperar una
fila, esta excepción detecta la existencia de más de una fila.

• Cursores explícitos en PL/ SQL: los cursores son áreas


de memoria que almacenan datos extraídos de la BD me-
diante una consulta SELECT o por manipulación de datos
con sentencias de actualización o inserción de datos.
La utilización de cursores es necesaria cuando:
– Se precisa tratamiento fila a fila.
– En sentencias SELECT que devuelven más de una fila.

El cursor debe ser declarado (en la zona DECLARE) antes


de usarlo. Debe tener un nombre y estar asociado a una
consulta determinada.

Sintaxis

DECLARE
CURSOR nombre_cursor IS sentencia_SELECT;

Entre las diferentes operaciones que se pueden realizar:


1. Open: para trabajar con un cursor debemos abrirlo e
inicializarlo para que devuelva las filas. Al hacer OPEN
en el cursor ya se ejecuta la consulta y pone todas las
filas devueltas en el conjunto activo.

Sintaxis

OPEN nombre_cursor;

2. Fetch: el cursor va a devolver la siguiente fila en el


conjunto activo. Los datos devueltos se almacenan en
variables de control o en un registro. Vamos a realizar
esto haciendo uso de la orden FETCH.

Sintaxis

FETCH nombre_cursor CURSOR INTO { [ var1, varN ] | nombre_registro };

Cada vez que se realiza un FETCH, el cursor avanza a la


siguiente fila recuperada, por lo que es necesario com-
probar los atributos del cursor para ver si el cursor tiene
filas o ya ha llegado al final.

85
Tema 11: Programación en bases de datos (BBDD)

Se debe recorrer el cursor hasta encontrar la informa-


ción que interese o hasta que no haya más filas. También
es necesario usar un bucle para repetir estas acciones
hasta conseguir el resultado buscado.
Un bucle de cursor FOR de forma implícita:
◦ Declara una variable REGISTRO de tipo ROWTYPE.
◦ Abre el cursor.
◦ De forma repetitiva realiza el FETCH de las filas sobre
la variable registro.
◦ Cierra el cursor cuando todas las filas han sido proce-
sadas.
3. Close: para finalizar debemos cerrar el cursor. Con-
seguimos así desactivarlo y liberar la memoria que
ocupaban los datos recuperados por este al abrirlo.

Sintaxis

CLOSE nombre_cursor;

Existe un número limitado de cursores que pueden


estar abiertos a la vez en la BD. Además, una vez cerra-
do no es posible recuperar datos hasta que no se abra
de nuevo.
Para declarar un cursor debemos emplear la siguiente
sintaxis:

Sintaxis

DECLARE CURSOR nombre_cursor IS <consulta_SELECT>;


BEGIN
OPEN nombre_cursor;-- Abrir el cursor
FETCH nombre_cursor INTO VARIABLES_PLSQL --Recorrer el cursor
CLOSE nombre_cursor ;-- Cerrar el cursor
END;
/

También podemos declarar los posibles parámetros


que necesite el cursor:

Sintaxis

DECLARE CURSOR nombre_cursor (parametro1 tipo1, parametro2


tipo2, parametro3 tipo3… ) IS <consulta>;
BEGIN
OPEN nombre_cursor; -- Abrir el cursor
FETCH nombre_cursor INTO VARIABLES_PLSQL --Recorrer el cursor
CLOSE nombre_cursor ;-- Cerrar el cursor
END;
/

86
Bases de datos - B

Los cursores implícitos no se pueden manipular por el


usuario, pero Oracle sí permite el uso de sus atributos:

nombre_cursor %atributo_deseado;

Los atributos pueden ser:

Atributo Significado

Devuelve un valor booleano: TRUE si está abierto el cursor o FALSE si


%ISOPEN
está cerrado.

Devuelve un valor booleano: TRUE si tras la recuperación más reciente


%NOTFOUND
no se recuperó ninguna fila.

Devuelve un valor booleano: TRUE si tras la recuperación más reciente


%FOUND
se recuperó una fila.

%ROWCOUNT Retorna el número de filas devueltas hasta el momento.

Cuando trabajamos con cursores debemos considerar una


serie de aspectos:

• Cuando un cursor está cerrado no se puede leer.


• Cuando leemos un cursor debemos comprobar el resul-
tado de la lectura utilizando los atributos de los cursores.
• Cuando se cierra el cursor es ilegal tratar de usarlo.
• Es ilegal tratar de cerrar un cursor que ya está cerrado o
no ha sido abierto.
Los atributos de los cursores pueden tomar los valores
TRUE, FALSE o NULL, dependiendo de la situación:

Antes de Al Durante la Al finalizar la Después


Atributo
abrir abrir recuperación recuperación de cerrar

%NOTFOUND ORA-1001 NULL FALSE TRUE ORA-1001

%FOUND ORA-1001 NULL TRUE FALSE ORA-1001

%ISOPEN FALSE TRUE TRUE TRUE FALSE

%ROWCOUNT ORA-1001 0 * ** ORA-1001

* Número de registros que ha recuperado hasta el momento.

** Número total de registros.

87
Tema 11: Programación en bases de datos (BBDD)

Por medio de ciclo LOOP podemos iterar a través del cur-


sor. Debemos tener cuidado al agregar una condición para
salir del bucle. Vamos a ver varias formas de iterar a través
de un cursor. La primera es utilizando un bucle LOOP con
una sentencia EXIT condicionada:

Sintaxis

OPEN nombre_cursor;
LOOP
FETCH nombre_cursor INTO lista_variables;
EXIT WHEN nombre_cursor %NOTFOUND;
/* Procesamiento de los registros recuperados */
END LOOP;
CLOSE nombre_cursor;
/

A continuación, vamos a ver un ejemplo donde se ilustra


el trabajo con un cursor explícito. Debemos tener en cuen-
ta que, al leer los datos del cursor, hay que hacerlo sobre
variables que sean del mismo tipo de datos de la tabla o
tablas de las que trata el cursor. Tendremos que crear un
bucle para recorrer los distintos registros que nos puede
devolver la consulta.

Ejemplo

SET SERVEROUTPUT ON;


DECLARE
  CURSOR calumno
IS
  SELECT nombre, apellidos
  FROM Alumnos;
vnombre VARCHAR2(50);
vapellidos VARCHAR2(50);
BEGIN
  OPEN calumno;
LOOP
  FETCH calumno INTO vnombre, vapellidos;
EXIT WHEN calumno%NOTFOUND;
dbms_output.put_line('Nombre: ' || vnombre || ' apellido: ' || vapellidos);
END LOOP;
  CLOSE calumno;
END;
/

Podemos simplificar el ejemplo, utilizando un atributo del


tipo %ROWTYPE sobre el cursor y cambiar el bucle de
iteración de registros para ver distintas formas de realizar
un mismo ejemplo.

88
Bases de datos - B

Ejemplo

SET SERVEROUTPUT ON;


DECLARE
  CURSOR calumno
IS
  SELECT nombre, apellidos
  FROM Alumnos;
registro calumno%ROWTYPE;
BEGIN
  OPEN calumno;
FETCH calumno INTO registro;
WHILE calumno%FOUND LOOP 
  dbms_output.put_line('Nombre: ' || registro.nombre
|| ' apellido: ' || registro.apellidos);
FETCH calumno INTO registro;
END LOOP;
CLOSE calumno;
END;
/

• Cursores de actualización: se declaran de la misma for-


ma que los explícitos, añadiendo FOR UPDATE al final de
la sentencia SELECT.

Sintaxis

CURSOR nombre_cursor IS
instrucción_SELECT
FOR UPDATE [OF column_list] [NO WAIT]

Para actualizar los datos del cursor ejecutamos la sentencia


UPDATE y especificamos la cláusula WHERE CURRENT OF
<cursor_name>.

Sintaxis

UPDATE <nombre_tabla> SET


<campo_1> = <valor_1>
[,<campo_2> = <valor_2>]
WHERE CURRENT OF <cursor_name>

Al trabajar con cursores de actualización se debe tener en


cuenta que generan bloqueos en la BD. A continuación,
vamos a ver un ejemplo de cómo utilizar los cursores de
actualización.

89
Tema 11: Programación en bases de datos (BBDD)

Ejemplo

SET SERVEROUTPUT ON;


DECLARE
CURSOR calumno IS
SELECT nombre
FROM alumnos
FOR UPDATE;
vnombre VARCHAR2(50);
BEGIN
dbms_output.put_line('Valores antes de actualizarse');
OPEN calumno;
FETCH calumno INTO vnombre;
WHILE calumno %foundLOOP
dbms_output.put_line('Nombre: '|| vnombre;);
UPDATE alumnos
SET nombre=nombre||'.'
WHERE CURRENT OF calumno;
FETCH calumno INTO vnombre;
END LOOP;
CLOSE calumno;
COMMIT;

dbms_output.put_line('');
dbms_output.put_line('Valores después de actualizarse');
OPEN calumno;
FETCH calumno INTO vTitulo,iAno,vProtagonista;
WHILE calumno% found LOOP
dbms_output.put_line ('Nombre: '||vnombre;);
FETCH calumno INTO vnombre;
END LOOP;
CLOSE calumno;
END;
/

Sobre las herramientas de depuración y control de


código hay que indicar que PL/SQL no está pensado para
interactuar directamente con un usuario final. Por este mo-
tivo, carece de instrucciones especializadas en la entrada y
salida, teclado y pantalla.

Existen algunos métodos que nos permiten mostrar el re-


sultado de lo que se está haciendo por pantalla, así como
poder asignar valores a las variables desde teclado para ir
probando cómo se comportan los programas con distintos
valores en las variables, sin necesidad de ir modificando el
código en cada caso.

• La salida: debemos activar la variable SERVEROUTPUT


de Oracle. Solo tendremos que hacerlo una vez:

90
Bases de datos - B

Sintaxis

SET SERVEROUTPUT ON;

Tras su activación, se pueden mostrar textos, variables y


constantes en pantalla usando la siguiente instrucción:

Sintaxis

DBMS_OUTPUT.PUT_LINE ( cadena_de_salida );

Ejemplos

-- Texto:
DBMS_OUTPUT.PUT_LINE ('hola');
-- Variables:
DBMS_OUTPUT.PUT_LINE ( nombre_variable );
-- Constantes:
DBMS_OUTPUT.PUT_LINE ( sysdate);
-- Combinaciones:
DBMS_OUTPUT.PUT_LINE ('cadena de texto ' || contador || sysdate );

• La entrada: la forma de leer valores desde teclado y con-


seguir asignarlos a una variable, consiste en utilizar el
símbolo & seguido del mensaje que se visualizará al pedir
la entrada del valor.
Este mensaje debe ser una cadena de caracteres sin espa-
cios en blanco. Para separar las palabras del mensaje se
recomienda hacerlo con guiones bajos.
Este tipo de recogida de valores se realizará al iniciar la
ejecución del procedimiento, independientemente del
lugar donde se realice la petición dentro del código.

Entrada de valores a variables por teclado:

Sintaxis

nombreVariable := &Texto_para_mostrar;

Por ejemplo:

Ejemplo

SET SERVEROUTPUT ON;


DECLARE
Lado INT;
BEGIN
-- Introducir lado del cuadrado para calcular su área
Lado := &INTRODUCE_EL_VALOR_DEL_LADO_DEL_CUADRADO;
DBMS_OUTPUT.PUT_LINE ('Un cuadrado de lado' || lado ||
' tiene un área de ' || Lado*Lado );
END;
/
91
Tema 11: Programación en bases de datos (BBDD)

Al ejecutar este bloque nos solicitarán el lado del cuadrado:

ponte a prueba

Los cursores implícitos son aquellos que


devuelven varios registros y se tienen que
recorrer.
a) Verdadero
b) Falso

¿Cuál de las siguientes opciones es un atri-


buto de un cursor explicito?
a) %ISOPEN
b) %OPEN
c) %FOUND
d) %ISCLOSE
e) A y C son correctas

92
Bases de datos - B

11.6.  Disparadores o triggers


CONCEPTO

Un trigger es un módulo PL/SQL compilado


y almacenado en la BD que tiene asociada
una tabla y que se ejecuta al llevar a cabo una
instrucción SQL.

Van a ser muy útiles cuando queramos:

• Forzar reglas de integridad que son difíciles de definir a


partir de constraints.
• Realizar cambios en la BD de forma transparente para el
usuario.
• Sincronizar el mantenimiento de tablas duplicadas que
están localizadas en nodos distintos de una BD distribuida.
• Generar automáticamente valores de columnas deri-
vadas en base a un valor proporcionado por una sentencia.
Uno de los usos más frecuentes de los triggers es definir
reglas y restricciones de integridad de los datos que sean
complejas. Es importante que los datos de una BD estén
sujetos a reglas de integridad predefinidas. Oracle permite
definir y forzar que se verifiquen las reglas de integridad de-
clarando restricciones de integridad y definiendo triggers.

Una restricción de integridad es un método declarativo


para definir una restricción para una columna de una tabla.
Oracle soporta:

1. Not Null: no admite valores nulos


2. Unique: solo admite valores únicos
3. Primary Key: clave primaria
4. Check: reglas complejas
5. Foreign Key: restricciones de integridad referencial

Aunque podemos definir y forzar cualquier tipo de regla de


integridad, se recomienda que solo se use en los siguientes
casos:

• Definir acciones de integridad referencia que no se pue-


dan forzar con Foreign Key.
• Forzar reglas de integridad referencia si las tablas padre e
hija están en nodos distintos de una BD distribuida.
• Forzar reglas complejas que no se puedan definir con res-
tricciones de integridad.

93
Tema 11: Programación en bases de datos (BBDD)

Sintaxis

CREATE [ OR REPLACE ] TRIGGER nombre_trigger


[ BEFORE | AFTER ] [ DELETE | INSERT | UPDATE [ OF columnas ] ]
[ OR ] [ DELETE | INSERT | UPDATE [ OF columnas ] ] …]
ON tabla
[ FOR EACH ROW [ WHEN condición TRIGGER ] ]
[DECLARE ]
-- declaración de variables locales
BEGIN
-- Instrucciones de ejecución
[ EXCEPTION ]
-- instrucciones de excepción
END;
/

En este caso:

• BEFORE | AFTER indica en qué momento queremos que


se ejecute el trigger, antes o después de la acción SQL:
– BEFORE: la usaremos cuando queremos revisar los
cambios antes de que se hagan efectivos sobre la tabla
para poder modificarlos en caso de que incumplan al-
guna restricción.
– AFTER: la usaremos en aquellos casos en los que se
quiera consultar o cambiar la tabla en cuestión, ya que
los triggers solo pueden llevar a cabo estas operaciones
después de que los cambios iniciales son aplicados a la
tabla y esta se encuentra en un estado estable.
• DELETE | INSERT | UPDATE: acciones SQL que disparan
el trigger.
• FOR EACH ROW: indicamos que el trigger se disparará
por cada fila de la tabla sobre la cual se lleva a cabo la
operación SQL.
• WHEN: podemos incluir una condición de disparo del tri-
gger.
• Cuerpo del programa: entre BEGIN y END se puede co-
dificar cualquier orden de consulta o manipulación de
datos y llamadas a funciones o procedimientos, como en
cualquier código PL/SQL, respetando la integridad de la
BD. No se puede usar el control de transacciones COM-
MIT y ROLLBACK. Los procedimientos y funciones a las
que invoque el trigger deben cumplir también las restric-
ciones anteriores.
Un trigger puede dispararse por causa de más de una
operación SQL. Podemos utilizar los siguientes predicados
condicionales:

94
Bases de datos - B

• INSERTING: devuelve TRUE cuando el trigger ha sido


disparado por una orden INSERT.
• DELETING: devuelve TRUE cuando el trigger ha sido dis-
parado por una orden DELETE.
• UPDATING: devuelve TRUE cuando el trigger ha sido
disparado por una orden UPDATE.
• UPDATING (columna): devuelve TRUE cuando el trigger
ha sido disparado por una orden UPDATE y la columna ha
sido modificada.

Para hacer referencia en el código al valor nuevo o al valor


viejo de las columnas que estamos modificando, hacemos
uso de las palabras reservadas OLD y NEW siguiendo estas
reglas:

• En las modificaciones de una fila, la referencia al valor


antes de ser modificado (:OLD) y al valor después de la
modificación (:NEW).
• En la introducción de valores nuevos se hace referencia
solo al valor nuevo (:NEW).
• En los borrados de valores se hace referencia solo al va-
lor antiguo (:OLD).
• En la condición WHEN de los triggers se deben utilizar
quitando los dos puntos, es decir, NEW y OLD.

95
Tema 11: Programación en bases de datos (BBDD)

Por ejemplo, para las siguientes tablas:

• Trigger para validar las fechas de alta y de baja:

Ejemplo

CREATE OR REPLACE TRIGGER empleados_fechaBaja_fechaAlta


BEFORE INSERT OR UPDATE OF FechaAlta, FechaBaja ON EMPLEADO
FOR EACH ROW
BEGIN
IF (:new.FechaBaja IS NOT NULL) AND (:new.FechaBaja <= :new.FechaAlta)
THEN
RAISE_APPLICATION_ERROR (-20600, 'La fecha de la baja debe ser nula o
mayor que la fecha de alta');
END IF;
END;
-- Sentencia con la que haríamos saltar el error del trigger creado
INSERT INTO EMPLEADO (FechaAlta, FechaBaja)
VALUES ('10-05-2017', '08-05-2017');
/

96
Bases de datos - B

• Trigger para validar los empleados supervisados por el


jefe:

Ejemplo

CREATE OR REPLACE TRIGGER empleado_supervisores


BEFORE INSERT OR UPDATE OF DNIjefe ON EMPLEADO
FOR EACH ROW
DECLARE
-- variable para contar los empleados subordinados
v_supervisados INTEGER;
BEGIN
SELECT count(*) INTO v_supervisados
FROM empleado WHERE DNIjefe= :new.DNIjefe;
-- cuenta los subordinados antes de actualizar o insertar
IF (v_supervisados >= 10 ) THEN
-- cuenta antes de la inserción o actualización del código jefe
RAISE_APPLICATION_ERROR (-20601, 'El jefe no puede supervisar a
más de 10 empleados');
END IF;
END;
/

ponte a prueba
Un trigger es un módulo PL/SQL compilado
y almacenado en la base de datos que tiene
asociada una tabla y que se ejecuta al llevar
a cabo una instrucción SQL.
a) Verdadero
b) Falso

Para que un trigger se ejecute después de


una determinada acción, ¿qué clausula
debemos indicarle?
a) AFTER
b) INSERTING
c) BEFORE
d) UPDATING

¿Qué clausula utilizaremos en un campo si


queremos referenciar el valor antes de ser
modificado?
a) :AFTER
b) :OLD
c) :BEFORE
d) :NEW

97
12
USO DE LAS BBDD OBJETO-RELACIONALES
Bases de datos - B

Teoria de BBDD objeto-relación


https://youtu.be/pba_ikgCI3Q

Hasta ahora hemos trabajado con las BBDD relacionales.


Estas poseen una serie de normas y una estructura bien
definida y algo rígida.

Sin embargo, existen otros tipos de modelos de BBDD más


flexibles y versátiles, como por ejemplo, las BBDD orienta-
das a objetos, las cuales están definidas en base a diferentes
objetos que poseen una serie de funcionalidades, con una
filosofía similar a la POO.

No obstante, existe un modelo híbrido, que es el que estu-


diamos en este tema: las BBDD objeto-relacionales.

Las BBDD objeto-relacionales son como una extensión


del modelo relacional que hemos estado viendo. No utili-
zan parte de las reglas que antes sí usábamos, pero por otro
lado, añaden una nueva solución a la hora de modelar la
información.

La mayor diferencia que existe entre las BBDD relacionales


y las BBDD objeto-relacionales es la existencia de tipos de
objetos.

Los tipos se crean mediante sentencias ODL (Object Defi-


nition Language) y van a ser la base del desarrollo de las
BBDD objeto-relacionales.

Cuando tengamos que definir el modelo objeto-relacional


añadiremos a las características anteriores (entidades, re-
laciones, atributos y reglas) los tipos.

99
Tema 12: Uso de las BBDD objeto-relacionales

Tipos de objetos

Un tipo de objeto representa una entidad del mundo real


que consta de las siguientes partes:

• Un nombre que permite identificar el tipo objeto.


• Unos atributos que caracterizan el objeto.
• Unos métodos que definen las operaciones sobre los da-
tos de ese tipo ya definidos.

12.1.  Características
La principal característica que debemos destacar de las
BBDD objeto-relacionales es que combinan el modelo rela-
cional con el modelo orientado a objetos, de tal modo que
evolucionan con la incorporación de algunos conceptos del
modelo orientado a objetos.

Por ejemplo, este tipo de BBDD permite la creación de


nuevos tipos de datos manteniendo todo lo que ya posee
del modelo entidad-relación, como las entidades, los atri-
butos, las relaciones y las reglas.

En el modelo objeto-relacional, cada registro de una tabla


se considera un objeto y la definición de la tabla, su clase.
Este modelo tiene capacidad para gestionar tipos de datos
complejos, lo cual contradice algunas de las restricciones
establecidas por el modelo relacional.

• Permite campos multivaluados, con lo cual, contradice


frontalmente la 1FN.

ALUMNOS

DNI NOMBRE ASIGNATURAS

123456P Paco {M01, M03A}

321456O Marta {M05, M02B}

• Las tablas dejan de ser elementos bidimensionales para


pasar a convertirse a estructuras de datos bastante más
complejas.
Por ejemplo: una columna puede ser tipo Asignatura,
conteniendo toda la información de esta y no únicamen-
te su clave ajena.

ALUMNOS

DNI NOMBRE ASIGNATURAS

123456P Paco {aNombre: Bases de datos


aCodigo:M02A}

100
Bases de datos - B

• De la misma forma, también es posible que los valores


que adopte un campo sean registros de otra tabla, es
decir, colecciones de objetos. Es lo que se conoce como
modelo relacional anidado.

ALUMNO

NOMBRE

DNI

DOMICILIO DOMICILIO

CALLE

NÚMERO

CIUDAD

Por otra parte, las BBDD relacionales se caracterizan por-


que se basan en una Programación Orientada a Objetos
(POO), que se desarrolla basándose en tres elementos fun-
damentales: encapsulamiento, herencia y polimorfismo.

Encapsulamiento

Conocemos por encapsulamiento el mecanismo que vamos


a seguir para agrupar los atributos y métodos dentro de un
nuevo concepto que denominamos clase. Mediante el uso
de clases podemos abstraer un tipo de objeto como un
conjunto de datos y acciones que están agrupadas.

Si utilizamos el encapsulamiento debemos tener definidos


todos los métodos que vayan a formar parte de las clases que
intervengan. Estos métodos, deben acompañar el objeto.

Herencia

Una de las grandes ventajas de trabajar con objetos es la


herencia, la cual permite crear superclases abstractas para
posteriormente utilizarlas para crear subclases más especí-
ficas. Estas heredarán atributos y métodos de la superclase.
Es decir, podemos crear subclases de clases creadas ante-
riormente.

Un ejemplo en el cual podemos apreciar de forma sencilla


qué es la herencia es en una escuela, donde nos podemos
encontrar alumnos, profesores y empleados. La caracte-
rística en común que tienen es de una persona: nombre,
identificador, teléfono, edad, etc.

101
Tema 12: Uso de las BBDD objeto-relacionales

En el siguiente ejemplo se creará una superclase llamada


persona que englobe los atributos comunes de persona:

EJEMPLO

CREATE OR REPLACE TYPE persona ASOBJECT (


id NUMBER,
nombre VARCHAR2(20),
telefonoslistin)
NOT FINAL
/

Como se puede apreciar, se ha incluido la cláusula NOT


FINAL. Esta nos indica que este objeto permite que a través
de él se generen más objetos.

Crearemos un objeto de persona que se extienda del objeto


persona.

EJEMPLO

CREATE OR REPLACE TYPE estudiante UNDER persona (


nombre_escuela VARCHAR2(30),
nota_media NUMBER)
NOT FINAL
/

En este ejemplo anterior, se puede observar que la cláusula


UNDER especifica la superclase a la cual pertenece estu-
diante. Se incluye NOT FINAL al final para poder ampliar
estas clasificaciones. Por ejemplo, un estudiante de inter-
cambio:

EJEMPLO

CREATE OR REPLACE TYPE estudiante_int UNDER estudiante (


pais VARCHAR2(30),
nombre_escuela VARCHAR2(30))
/

Polimorfismo

Se utiliza el polimorfismo cuando una clase derivada


debe verse como la clase principal. Esto significa que se
va a disponer de un objeto de una clase derivada, pero nos
vamos a referir a él como si fuera un objeto de una clase
principal.

Además, nos permite ejecutar diversas funciones que han


sido sustituidas, como por ejemplo: overrided (sobre-
cargadas) o overwritten (sobrescritas). PL/SQL utiliza la
sobrecarga.

102
Bases de datos - B

ponte a prueba
¿En qué conceptos fundamentales se basa la
programación a objetos?
a) Encapsulamiento, herencia y polimorfismo
b) Funcionalidad, herencia y polimorfismo
c) Funcionalidad, herencia y modularidad
d) Modularidad, funcionalidad y
encapsulamiento

La principal característica que debemos


destacar de las bases de datos objetos-
relacionales es que no utilizan el modelo
relacional debido a la incorporación de
conceptos del modelo orientado a objetos.
a) Verdadero
b) Falso

12.2.  Tipos de datos objeto


Los objetos han conseguido entrar en el mundo de las BBDD
en forma de dominios, actuando como el tipo de datos de
una columna determinada. A continuación, vamos a ver
dos implicaciones muy importantes que se producen
por el hecho de utilizar una clase como un dominio:

• Es posible almacenar múltiples valores en una columna de


una misma fila, ya que un objeto suele contener múltiples
valores. Sin embargo, si se utiliza una clase como domi-
nio de una columna, en cada fila esa columna solo puede
contener un objeto de la clase (se sigue manteniendo la
restricción del modelo relacional de contener valores ató-
micos en la intersección de cada fila con cada columna).
• Es posible almacenar procedimientos en las relaciones
porque un objeto está enlazado con el código de los pro-
cesos que sabe realizar (los métodos de su clase).
Otro modo de incorporar objetos en las BBDD relacionales
es construyendo tablas de objetos, donde cada fila es un
objeto.

Ya que un sistema objeto–relacional es un sistema rela-


cional que permite almacenar objetos en sus tablas, la BD

103
Tema 12: Uso de las BBDD objeto-relacionales

sigue sujeta a las restricciones que se aplican a todas las


BBDD relacionales y conserva la capacidad de utilizar ope-
raciones de concatenación (JOIN).

Los usuarios pueden definir sus propios tipos de datos a


partir de los tipos básicos provistos por el sistema o por
otros tipos de datos predefinidos anteriormente por el
usuario. Estos tipos de datos pueden pertenecer a dos ca-
tegorías distintas: objetos y colecciones.

ponte a prueba

¿Para crear tipos objeto que clausula utiliza-


remos?
a) CREATE OBJECT
b) CREATE TYPE
c) CREATE CLASS
d) CREATE FUNCTION

¿Cuáles de las siguientes opciones son


restricciones para métodos de objetos?
a) WINDS
b) RNDS
c) WNPS
d) RNPS
e) Todas las opciones son correctas

12.3.  Definición de tipos de


objeto
En Oracle, los tipos de objeto son aquellos tipos de datos
que han sido definidos por el usuario. Los objetos se pre-
sentan de forma abstracta, almacenados en columnas y
tablas.

Para poder crear tipos de objeto se debe hacer uso de la


sentencia CREATE TYPE. Está compuesta por los siguien-
tes elementos:

• Un nombre para identificar los tipos de objeto


• Unos atributos, que pueden ser de un tipo de datos bá-
sico o de un tipo definido por el usuario, que representan
la estructura y los valores de los datos de ese tipo

104
Bases de datos - B

• Unos métodos que son procedimientos o funciones. Se


declaran con la cláusula MEMBER

Ejemplo

CREATE OR REPLACE TYPE persona AS OBJECT (


nombre VARCHAR2(30),
teléfono VARCHAR2(20)
);
/

Se puede observar que cada objeto persona tendrá dos


atributos: el nombre y el teléfono. Vamos a ver, a continua-
ción, la definición de un tipo de objeto:

Sintaxis

CREATE OR REPLACE TYPE nombreObjeto ASOBJECT(


atributo1 TIPO,
atributo2 TIPO,
atributoN TIPO,
MEMBER FUNCTION nombreFuncion1 RETURNTIPO,
MEMBER FUNCTION nombreFuncion2(nomVar TIPO) RETURN TIPO,
MEMBER PROCEDURE nombreProcedimiento
PRAGMA RESTRICTREFERENCES (nombreFuncion1, restricciones),
PRAGMA RESTRICTREFERENCES (nombreFuncion2, restricciones),
PRAGMA RESTRICTREFERENCES (nombreProcedimiento, restricciones)
);
/

Un método miembro de un tipo de objeto debe cumplir las


siguientes características:

• No puede insertar, actualizar o borrar las tablas de la BD.


• No se puede ejecutar en paralelo o remotamente si va a
acceder a los valores de una variable dentro de un módulo.
• No puede modificar una variable de un módulo excepto si
se invoca desde una cláusula SELECT, VALUES o SET.
• No puede invocar a otro módulo o subprograma que
rompa alguna de las reglas anteriores.

La directiva PRAGMA_REFERENCES se utiliza para forzar


las reglas anteriores.

Sintaxis

PRAGMA RESTRICT REFERENCES ({DEFAULT | método}, {RNDS, WNDS, RNPS,


WNPS}, [RNDS, WNDS, RNPS, WNPS]});

105
Tema 12: Uso de las BBDD objeto-relacionales

Donde restricciones puede ser cualquiera de las siguientes


o incluso una combinación de ellas:

• WINDS: evita que el método pueda modificar las tablas


de la BD.
• RNDS: evita que el método pueda leer las tablas de la BD.
• WNPS: evita que el método modifique variables del pa-
quete PL/SQL.
• RNPS: evita que el método pueda leer las variables del
paquete PL/SQL.

Veamos ahora la definición del cuerpo de un objeto:

Sintaxis

CREATE OR REPLACE TYPE BODY nombre Objeto AS


MEMBER FUNCTION nombreFuncion
RETURNTIPO
IS
BEGIN
--Código de la función
END nombreFuncion;
MEMBER FUNCTION nombreFuncion2(nomVar TIPO)
RETURNTIPO
IS
BEGIN
--Código de la función 2
END nombreFuncion2;
MEMBER PROCEDURE nombreProcedimiento
IS
BEGIN
--Código del proceso
END nombreProcedimiento;
END;
/

Por ejemplo:

Ejemplo Definición de clase

CREATE OR REPLACE TYPE Persona AS OBJECT(


idpersona NUMBER,
dni VARCHAR2(9),
nombre VARCHAR2(15),
apellidos VARCHAR2(30),
fecha_nac DATE,
MEMBER FUNCTION muestraEdad RETURN NUMBER,
PRAGMA RESTRICT_REFERENCES (muestraEdad, WNDS)
);
/

106
Bases de datos - B

Ejemplo Cuerpo de clase

CREATE OR REPLACE TYPE BODY persona AS


MEMBER FUNCTION muestraEdad RETURN NUMBER
IS
BEGIN
RETURN to_char(sysdate,'YYYY')-to_char(fecha_nac,'YYYY');
END muestraEdad;
END;
/

Una vez que ya tenemos definida la clase y el cuerpo, po-


demos utilizar este objeto como si de un tipo cualquiera se
tratase.

Ejemplo

SET SERVEROUTPUT ON;


DECLARE
Trabajador1 Persona;
BEGIN
Trabajador1:=NEW Persona(1,'123456','Alberto','Olivia',
'22/12/1989');
dbms_output.put_line('El empleado '|| Trabajador1.nombre
||' ha sido creado');
dbms_output.put_line('Edad del empleado: '
||Trabajador1.muestraEdad());
END;
/

Colecciones

Para poder contar con atributos multievaluados (1:N) es ne-


cesario que los organicemos en una estructura de datos. Una
estructura es conocida como array o colección. Para crear un
atributo de tipo array debemos usar la siguiente sintaxis.

Ejemplo

-- Lista de un tipo primitivo varchar2


CREATE TYPE colec_nombres ASVARRAY(10) OFVARCHAR2(20);
-- Lista de un tipo de usuario: Persona
CREATE TYPE colec_personas ASVARRAY(10) OF Persona;

Una vez que ya hemos creado un tipo de colección, pode-


mos utilizarla dentro de la definición de una clase:

Ejemplo

CREATE OR REPLACE TYPE Departamento ASOBJECT(


NombreDept VARCHAR2(100),
Empleados colec_personas
);
/

107
Tema 12: Uso de las BBDD objeto-relacionales

Tablas derivadas de objetos

De la misma forma que creamos objetos haciendo uso de los


tipos definidos, también podemos hacerlo con las tablas:

Ejemplo

CREATE TABLE Empleados (


NombreDept VARCHAR2(50),
Datos_Empleado Persona
);
/

Para hacer un insert debemos indicar el tipo de objeto que


estamos insertando:

Ejemplo

INSERT INTO Empleados


VALUES('Informática', Persona(1, '1111',
'Paco', 'González', '23/12/1988'));

108
Bases de datos - B

12.4.  Herencia
Herencia
https://youtu.be/dzkezEDgjds

Una de las principales ventajas de la POO es la herencia.


Gracias a la herencia se pueden crear superclases abs-
tractas para que, en adelante, se puedan crear subclases
más específicas que hereden atributos y métodos de las
superclases.

En las BBDD objeto-relacionales se puede hacer algo pa-


recido en lo que se refiere a los tipos de objetos. Pueden
crearse subtipos de objetos a partir de otros supertipos de
objetos que ya han sido creados con anterioridad.

El supertipo define los atributos o métodos que van a


compartir con los subtipos, todos los objetos que here-
den de él. A parte de estos, los subtipos también pueden
definir sus propios atributos y métodos. También pueden
redefinir los métodos del supertipo para adoptarlo a sus
necesidades. Este proceso se conoce como polimorfismo.

Veamos, por ejemplo, desde el objeto general supertipo


TIPO_PERSONA podemos definir el subtipo TIPO_EMPLEA-
DO que va a heredar las características de su supertipo
TIPO_PERSONA.

El tipo objeto especializado TIPO_EMPLEADO puede tener


atributos adicionales o incluso puede redefinir métodos
del objeto padre TIPO_PERSONA ampliando la funcionali-
dad de sus tipos objeto.

La cláusula NOT FINAL hace referencia a que este


objeto no es el último. Es decir, cuando creemos
subtipos de objetos que cuelguen de este, tendremos
que declarar el objeto con esta cláusula. En el caso
de no poner la cláusula al crear este objeto, cuando
queramos colgar otros objetos de este nos devolverá
error, aunque nos compile el objeto

Tipo persona

Ejemplo

CREATE TYPE tipo_person AS OBJECT (


nombre VARCHAR2(25),
fecha_nac DATE,
MEMBER FUNCTION edad RETURN NUMBER,
MEMBER FUNCTION printme RETURN VARCHAR2
) NOT FINAL;
/

109
Tema 12: Uso de las BBDD objeto-relacionales

Subtipo empleado: para crear un subtipo utilizamos la


cláusula UNDER.

Ejemplo

CREATE TYPE tipo_empleado UNDER tipo_person (


sueldo NUMBER,
MEMBER FUNCTION paga RETURN NUMBER,
OVERRIDING MEMBER FUNCTION printme RETURN VARCHAR2);
/

Heredamos los atributos y los métodos añadiendo caracte-


rísticas propias de tipo_person y sobrescribimos el método
printme.

ponte a prueba

Podríamos catalogar a la herencia como una


de las principales desventajas de la progra-
mación orientada a objetos ya que debe-
remos lidiar con las características de esta.
a) Verdadero
b) Falso

¿Cuál de las siguientes clausulas utiliza-


remos para crear un objeto que hereda de
otro?
a) UNDER
b) HERITAGE
c) EXTEND
d) SUBCLASS

Utilizaremos la cláusula NOT FINAL para


indicar a un objeto que no es el ultimo de la
jerarquía y se crearán objetos que heredarán
de él.
a) Verdadero
b) Falso

110
Bases de datos - B

12.5.  Identificadores,
referencias
El tipo REF o referencia es un contenedor de un identifi-
cador de objeto (Object Identifier –OID). Es un puntero a
un objeto. Su utilidad se basa, principalmente, en apuntar
a un objeto que ya existe y así evitar tener que duplicar la
información que el objeto almacena.

Por ejemplo, si se desea crear una tabla de libros en la que


cada libro tiene su autor y esos autores ya están almace-
nados en una tabla de objetos, se podría hacer uso de la
palabra reservada REF para indicar que el autor ya existe y,
por tanto, solo se almacena una referencia a ese autor en la
tabla de libros.

Con la palabra reservada DEREF, obtenemos el valor de un


objeto al que apunta dicha referencia.

Ejemplo

CREATE TYPE autor AS OBJECT (


id INTEGER,
nombre VARCHAR(100),
direccion VARCHAR(255)
);
/
CREATE TYPE libro AS OBJECT (
id INTEGER,
nombre VARCHAR(200),
escritor REF autor
);
/

ponte a prueba

¿Cuál de las siguientes sintaxis es correcta


como un campo de una tabla que hace refe-
rencia a una tabla de objeto?
a) DREF
b) REF
c) REFERENCE
d) REFERENCIA

111
Tema 12: Uso de las BBDD objeto-relacionales

12.6.  Tipos de datos colección


Los tipos para colecciones se definen para poder im-
plementar relaciones 1:N. Un dato de tipo colección está
formado por un número indefinido de elementos, todos
del mismo tipo. Así, es posible almacenar un conjunto de
tuplas en un único atributo, en forma de array o de tabla
anidada.

Los tipos para colecciones también tienen, por defecto,


unas funciones constructoras de colecciones, cuyo nombre
coincide con el del tipo. Los argumentos de entrada de
estas funciones son el conjunto de elementos que forman
la colección separados por paréntesis.

Tipo Varray

Un array es un conjunto de elementos ordenados del


mismo tipo. Todos los elementos que lo componen poseen
asociado un índice que indica la posición que este ocupa
dentro del array.

Ejemplo

CREATE TYPE colec_telefono AS VARRAY (10) OF


VARCHAR2 (30);

Con esta instrucción definimos un nuevo tipo de datos lla-


mado colec_telefono, que va a tener como máximo grupos
de 10 valores y, además, van a tener 30 caracteres como
máximo. Creamos la tabla para representar la siguiente
estructura:

Ejemplo

CREATE TABLE alumno (


Id NUMBER,
Nombre VARCHAR2(20),
Telefonos colec_telefono
);

ID Nombre Teléfonos

1 Carmen (955701212, 614785222)

2 Antonio (957842563, 645458523)

112
Bases de datos - B

A la hora de insertar datos lo hacemos como en cualquier


tabla:

Ejemplo

INSERT INTO alumno


VALUES (1, 'Carmen' colec_telefono ('955701212', '614785222'));

Podemos comprobar que es necesario especificar el tipo


colec_telefono para que el SGBD realice las comprobacio-
nes necesarias.

Tablas anidadas

Una tabla es un conjunto de elementos del mismo tipo. Se


diferencian del tipo anterior porque en este tipo no existe
un orden predefinido.

Las tablas anidadas poseen una serie de restricciones:

• Solo pueden tener una columna.


• El tipo de dato que almacena puede ser básico o definido
por el usuario.

Si redefinimos nuestro ejemplo anterior, redefinimos el


tipo alumnos de la siguiente forma:

Ejemplo

CREATE TYPE tabla_telefono AS TABLE OF VARCHAR2 (30);

113
Tema 12: Uso de las BBDD objeto-relacionales

Creamos la tabla basándola en el tipo tabla_alumno:

Ejemplo

CREATE TABLE alumno (


id NUMBER,
nombre VARCHAR2 (20),
telefonos tabla_telefono)
NESTED TABLE telefonos STORE AS t_telefono;

Ahora la tabla_telefono ya no es un tipo colección, sino un


tipo tabla.

Las columnas que son tablas anidadas junto con los atri-
butos que son tablas de objetos necesitan de una tabla
independiente donde almacenar las filas de dichas tablas.
Para especificar esta tabla se utiliza la cláusula NESTED
TABLE...STORE AS...

Para consultar, insertar, borrar o actualizar información en


tablas anidadas se puede hacer igual que con las colec-
ciones.

ponte a prueba

Las colecciones son muy utilizadas para


crear relaciones M:N, ya que estas estarán
formadas por un numero indefinido de
elementos donde podremos almacenar
diferentes datos.
a) Verdadero
b) Falso

¿Cuál de las siguientes opciones es una


sintaxis válida para la creación de una
colección de tipo cadena de texto?
a) CREATE TYPE colec AS VARRAY (10) OF
VARCHAR2 (30);
b) C
 REATE COLECTION colec AS ARRAY (10) OF
VARCHAR2 (30);
c) CREATE COL colec AS ARRAY (10) OF
VARCHAR2 (30);
d) C
 REATE OBJECT colec AS VARRAY (10) OF
VARCHAR2 (30);

114
Bases de datos - B

12.7.  Declaración e
inicialización de objetos
Para declarar un objeto en la BD Oracle tenemos que crear
un nuevo tipo de datos. Podemos hacerlo de dos formas
diferentes:

• Mediante SQL Developer podemos conectarnos a una


BD ya creada en Oracle y, a partir de ahí, seleccionar Types
en el panel de conexiones.

• De una forma más directa, utilizando la instrucción CREA-


TE TYPE, cuya sintaxis es:

Sintaxis

CREATE [OR REPLACE] TYPE [schema.] type_name


[OID'object_identifier']
[object_type
| | {IS|AS} {varray_type_def | nested_table_type_def}
];

De forma que la definición de object_type se correspon-


de con:

Sintaxis

[inviker_rights_clause]
{{IS|AS} OBJECT
| UNDER [schema.]supertupe
}[sqlj_object_type]
[({attribute datatype [ sqlj_object_type_attr]}…
[, element_spec [, element_spec]…]
)
][[NOT]FINAL] [ [NOT] INSTANTIABLE]

115
Tema 12: Uso de las BBDD objeto-relacionales

Si nos basamos en SQL Developer, el programa nos genera


de forma automática la estructura básica para la creación
de un objeto. Aunque dentro de la misma tenemos que
definir las propiedades principales del objeto en cuestión,
como podemos apreciar en el siguiente código:

Creación y asignación de propiedades

CREATE OR REPLACE TYPE OBJPRODUCTO AS OBJECT


(
codigo varchar2(20), nombre varchar2(60),
familia varchar2(60), altura float, anchura
float, longitude float, peso float, color
varchar2(20), precioCompra float, precioVenta
float, fechaCr date
);
/

12.8.  Sentencia SELECT.


Inserción, modificación y borrado
de objetos

Inserción

Cuando tengamos que insertar objetos en una tabla, utili-


zaremos el comando INSERT:

Ejemplo

BEGIN
INSERT INTO person
VALUES('Juan', 'Mata');
END;
/

Aunque también tenemos la posibilidad de utilizar el cons-


tructor para el objeto en cuestión:

Ejemplo

BEGIN
INSERT INTO person
VALUES (Person ('Juan', 'Mata'));
END;
/

A continuación, vamos a ver un script con la tabla relacio-


nal departamento. Tiene una columna tipo person y va a
insertar una fila en esa tabla:

116
Bases de datos - B

Ejemplo

CREATE TABLE departamento (


dept_nombre VARCHAR2(20),
jefe_dept Person,
localidad VARCHAR2(20)
);
-- Inserción de datos
INSERT INTO departamento
VALUES('Contabilidad', Person ('Adrián', 'Tormo'), 'Lleida');

--Consultamos el tipo de dato


SELECT departamento.person.apellido FROM departamento;

Modificación

A la hora de modificar atributos de un objeto determinado


en una tabla de objetos vamos a utilizar la sentencia UPDA-
TE. Por ejemplo:

Ejemplo

BEGIN
UPDATE person p SET p. direccion = 'c/larga, 7'
WHERE p. apellido = 'López';
UPDATE person p SET p = Person ('Eva', 'García')
WHERE p. apellido = 'López';
END;
/

117
Tema 12: Uso de las BBDD objeto-relacionales

Borrado

Para eliminar objetos (filas) de una tabla, utilizaremos el


comando DELETE. Si tenemos que hacer un borrado selec-
tivo, añadiremos la cláusula WHERE. Por ejemplo:

Ejemplo

BEGIN
DELETE FROM person p
WHERE p.direccion = 'c/larga, 7';
END;
/

ponte a prueba

¿Cuál de las siguientes sentencias es correcta


como inserción del objeto persona que
vemos en la imagen?

a) INSERT INTO departamento VALUES


('Contabilidad', 'Adrian', 55);
b) I NSERT INTO departamento VALUES ('AD',
empleado(1,'Laura','Carvajal'), 'Madrid');
c) INSERT INTO departamento VALUES (1,
'Ramon', 55);
d) I NSERT INTO departamento VALUES (1,
empleado('Marina', 'Pecarova'), 'Lleida');

118
Bases de datos - B

119
BIBLIOGRAFÍA / WEBGRAFÍA
” Alfonso González (2010). Gestión de Bases de Datos. Madrid.
” Arturo Mora (2014). Bases de Datos. Diseño y Gestión. Vallehermoso, Madrid.
” Iván López, Manuel de Castro, John Ospino (2014). Bases de Datos. Madrid.
” Luis Hueso Ibáñez (2012). Bases de datos. Madrid.
solucionario
8.3 Instalación del cliente Oracle 10.2 Administración de privilegios
Indica el orden correcto que debemos seguir Un usuario de una BBDD posee una serie de
para instalar SQL Developer de Oracle. permisos y privilegios que nos indicarán qué
c) Descargar, desempaquetar, descomprimir y acciones pueden realizar dichos usuarios dentro
ejecutar. de la BBDD.
a) Verdadero.
9.1 Creación de bases de datos en Oracle ¿Cuáles de las siguientes opciones no es un tipo
Las conexiones a BBDD no utilizan nunca de de privilegios dentro de una BBDD?
contraseña, ya que esta podría deshabilitar el b) EXECUTE USER.
usuario principal del sistema.
b) Falso. 10.3 Administración de roles
Los usuarios principales de las conexiones de Los roles son grupos de privilegios que se
BBDD requieren de una contraseña. definen en el usuario de forma directa, ya que
estos no pueden ser almacenados en la BBDD.
9.2 Creación de BBDD en MySQL b) Falso.
En MySQL Workbench es posible conocer los A los roles se les asigna un nombre para ser
detalles de conexión al servidor, ¿cuál de las almacenado en la BBDD y poder referenciar este
siguientes opciones utilizaremos? rol a diferentes usuarios.
a) Server Status.
¿Cuál de las siguientes opciones no es un
beneficio de trabajar con roles?
10.1. Administración de usuarios
c) Un rol solamente puede abarcar un tipo de
¿Cuáles de las siguientes características permiso.
siguientes debería de cumplir un usuario de
BBDD? 11. programación en bases de datos (BBDD)
d) A y B son correctas. ¿Cuál de las siguientes características no nos
aporta el lenguaje PL/SQL?
Las cuentas de BBDD no tienen diferentes
estados, se crean y se eliminan, pero siempre d) No trabaja con estructuras de control de flujo.
con el mismo estado.
b) Falso. 11.2. Sintaxis del lenguaje de programación
¿En qué parte del código podemos declarar una
Una buena práctica es evitar hacer uso del
expresión que utilice un IF?
privilegio SYSDBA, para ello existen diferentes
tipos de privilegios dependiendo de la tarea d) B y C son correctas.
que deseemos realizar. Si se pretende gestionar
¿Cuál de las siguientes opciones es válida como
las credenciales de los usuarios, ¿qué privilegio
tipo de una variable dentro de un entorno de
se utilizará?
BBDD?
b) SYSKM.
a) DATE, INTEGER y CHAR.
Mediante el comando DBA_USERS se muestra la
lista y configuración de los usuarios del sistema. 11.3. Procedimientos y funciones
Entre los siguientes comandos, ¿cuál es el
¿Qué opción tendríamos que indicar a un
correcto para visualizar la estructura?
parámetro para que sea solo de entrada?
a) DESC DBA_USERS.
a) IN.
Existen varias formas de crear usuarios en
Las funciones y los procesos son lo mismo,
MySQL. Indica cuál de ellas es la correcta.
realizan las mismas acciones y permiten
d) Las respuestas a y c son correctas. ejecutarse al mismo nivel dentro de una base de
datos, aunque los procesos son más utilizados,
ya que las funciones son elementos obsoletos.
b) Falso.
solucionario
La diferencia entre las funciones y los procesos ¿Qué clausula utilizaremos en un campo si
reside en que las funciones devuelven datos queremos referenciar el valor antes de ser
(RETURN) y los procesos no, aunque podemos modificado?
utilizar parámetros de salida, no son lo mismo. b) :OLD.

11.4. Control de errores 12.1. Características


¿En qué parte del código podemos declarar un ¿En qué conceptos fundamentales se basa la
error definido por el usuario? programación a objetos?
a) Parte de declaraciones. a) Encapsulamiento, herencia y polimorfismo.

¿Cuáles de las siguientes opciones son La principal característica que debemos


excepciones conocidas por el sistema? destacar de las bases de datos objetos-
e) A y B son correctas. relacionales es que no utilizan el modelo
relacional debido a la incorporación de
No podemos generar excepciones propias, conceptos del modelo orientado a objetos.
siempre que queramos controlar excepciones b) Falso.
tendremos que utilizar las definidas por defecto Los sistemas de bases de datos objetos relacio-
por el sistema gestor de BBDD. nales combinan el modelo-relacional con la in-
b) Falso. corporación de conceptos del modelo orientado
Los sistemas gestores de BBDD ofrecen la a objetos.
posibilidad de generar excepciones propias del
usuario, las cuales declaramos como "EX- 12.2. Tipos de datos objeto
CEPTION" y se lanzarán con la palabra clave ¿Para crear tipos objeto que clausula
"RAISE". utilizaremos?
b) CREATE TYPE.
11.5. Cursores y transacciones
¿Cuáles de las siguientes opciones son
Los cursores implícitos son aquellos que
restricciones para métodos de objetos?
devuelven varios registros y se tienen que
recorrer. e) Todas las opciones son correctas.
b) Falso.
12.4. Herencia
Los cursores implícitos solo devuelven un re-
gistro y no es necesario su apertura y cierre, ya Podríamos catalogar a la herencia como una de
que comúnmente son utilizados en sentencias las principales desventajas de la programación
SELECT INTO. orientada a objetos ya que deberemos lidiar con
las características de esta.
¿Cuál de las siguientes opciones es un atributo
b) Falso.
de un cursor explicito?
La herencia es una gran ventaja de la progra-
e) A y C son correctas.
mación orientada a objetos ya que con esta
podremos reutilizar funcionalidades ya creadas
11.6. Disparadores o triggers con gran facilidad y aumentara el rendimiento
Un trigger es un módulo PL/SQL compilado de nuestros sistemas de BBDD.
y almacenado en la base de datos que tiene
¿Cuál de las siguientes clausulas utilizaremos
asociada una tabla y que se ejecuta al llevar a
para crear un objeto que hereda de otro?
cabo una instrucción SQL.
a) UNDER.
a) Verdadero.
Utilizaremos la cláusula NOT FINAL para indicar
Para que un trigger se ejecute después de una
a un objeto que no es el ultimo de la jerarquía y
determinada acción, ¿qué clausula debemos
se crearán objetos que heredarán de él.
indicarle?
a) Verdadero.
a) AFTER.
solucionario
12.5. Identificadores, referencias
¿Cuál de las siguientes sintaxis es correcta como
un campo de una tabla que hace referencia a
una tabla de objeto?
b) REF.

12.6. Tipos de datos colección


Las colecciones son muy utilizadas para crear
relaciones M:N, ya que estas estarán formadas
por un numero indefinido de elementos donde
podremos almacenar diferentes datos.
b) Falso.
Las colecciones son utilizadas para crear rela-
ciones 1:N, ya que tendrán un número indefini-
do de elementos pero todos del mismo tipo de
dato.

¿Cuál de las siguientes opciones es una sintaxis


válida para la creación de una colección de tipo
cadena de texto?
a) CREATE TYPE colec AS VARRAY (10) OF
VARCHAR2 (30);

12.8. Sentencia SELECT. Inserción,


modificación y borrado de objetos
¿Cuál de las siguientes sentencias es correcta
como inserción del objeto persona que vemos
en la imagen?

b) INSERT INTO departamento VALUES ('AD',


empleado(1,'Laura','Carvajal'), 'Madrid');

También podría gustarte