Está en la página 1de 14

UF3: LENGUAJE SQL

GESTIÓN DE USUARIOS
Al instalar Oracle, por defecto existen varias cuentas administrativas con permiso concedidos:
SYS: Superadministrador (rol de DBA). No interesa modificar su esquema porque es donde se crea el diccionario de datos.
SYSTEM: mismo rol que la anterior. Tiene tablas y vistas administrativas ya creadas.
SYSMAN: realiza tareas administrativas utilizando Enterprise Manager.
DBSMNP: controla la aplicación Enterprise Manager
Privilegios administrativos:
- SYSDBA permite:
▪ Iniciar o frenar diferentes instancias de una base de datos.
▪ Crear, modificar o borrar bases de datos.
▪ Recuperar bases de datos y conceder privilegios de sistema.
- SYSOPER:
▪ Realiza las mismas funciones que anterior, excepto crear borrar y recuperar bases de datos.
La vista v$PWFILE_USERS nos permite examinar a los usuarios administrativos.
Características de los usuarios:
Nombre de usuario: único. 30 caracteres máximo. excepciones, signos $ y _.
Configuración física (tablespace): espacio y límite de almacenamiento.
Perfil asociado: recursos de los que dispone el usuario del sistema.
Privilegios y roles: funciones que pueden realizar los usuarios.
Estado de la cuenta de un usuario:
Abierta
Bloqueada
Expirada
Expirada y bloqueada
Expirada en periodo de gracia
La primera conexión en SQL Developer ha de ser la SYSTEM, donde tenemos todos los privilegios y la contraseña es la que pusimos
en la DataBase de Oracle.
Crear usuarios: Desde el usuario SYSTEM tenemos todos los privilegios, aunque quizás al principio hay que lanzar el comando de
poder crear usuarios:
Dar permisos para poder crear usuario
alter session set "_ORACLE_SCRIPT"=true; Una vez dado este permiso (si fuese necesario), ya podemos crear un usuario:
Crear usuario
CREATE USER Ilerna IDENTIFIED BY ilerna123
DEFAULT TABLESPACE nombre_tablespace;
QUOTA 15M ON nombre_tablespace;
Aplicamos los permisos de solo conexión
GRANT ALL PRIVILEGES TO ilerna;
Conexión del usuario
CONN Ilerna / ilerna123;
Dar permiso de conexión
GRANT CREATE SESSION TO ilerna;
Dar permisos ...
GRANT CREATE TABLE TO ilerna;
GRANT CREATE [SELECT, INSERT, UPDATE, DELETE] ON nombre_tabla TO ilerna;
GRANT ALTER ON nombre_tabla TO ilerna;
GRANT [DROP, UPDATE, DELETE] ANY TABLE TO ilerna;
Mostrar usuarios, tablespaces, etc… (desde SYSTEM)
SELECT * FROM DBA_USERS; DESCRIBE DBA_USERS;
Para saber a qué usuario estamos conectados
SHOW USER;
Creación de un tablespace
CREATE TABLESPACE nombre_tablespace DATAFILE “C:\RUTA..\nombre_fichero.dbf”
SIZE 100M AUTOEXTEND ON NEXT 100K MAXSIZE 200M;
MODIFICACIÓN DE USUARIO
ALTER USER ilerna ACCOUNT UNLOCK;
Borrado de usuario
DROP USER nombre_usuario [CASCADE]; Con CASCADE se eliminan primero los objetos asociados al usuario y luego al
usuario.
PERFILES: Definen un conjunto de recursos.
PRIVILEGIOS:
 TIPO DE PRIVILEGIO: Select, Insert, update, delete, alter..
 ON...:

- Nombre_tabla.
- * (sobre todas las tablas de la BBDD que se está utilizando.
- *.* (sobre todas las tablas de todas las BBDD.
- base_datos.nombre_tabla.
 TO: indica el usuario a quien se otorga el permiso.
 WITH: permite indicar ciertas opciones 

LISTADO DE PRIVILEGIOS:

Dar todos los privilegios a un


usuario (sentencia peligrosa)
GRANT ALL PRIVILEGES TO
ilerna;

Quitar privilegios
REVOKE ALL PRIVILEGES
FROM ilerna;

El DBA tendrá todos los derechos


con la cláusula ALL, tanto para
concederlos com para revocarlos.
Ejemplo:

Quitar todos los privilegios  REVOKE ALL PRIVILEGES ON *.* FROM ilerna@localhost;

Quitar algún privilegio  REVOKE [SELECT, INSERT, UPDATE, DELETE] ON nombre_tabla FROM ilerna@localhost;
2
Asignar un usuario a un tablespace
ALTER USER ILERNA DEFAULT TABLESPACE TEST01;
Alterar el tamaño de un tablespace
ALTER DATABASE DATAFILE 'C:\app\vmart\product\18.0.0\oradata\XE\test01.dbf' RESIZE 100M;
O también podemos añadir un nuevo fichero a ese mismo tablespace
ALTER TABLESPACE TEST01 ADD DATAFILE 'C:\app\vmart\product\18.0.0\oradata\XE\test02.dbf' SIZE 50M;
Para eliminar un tablespace
DROP TABLESPACE TEST01; *Si eliminamos el tablespace, el fichero sigue en el directorio.

ROLES (Las definiciones de roles se almacenan en el diccionario de datos).


Un rol es un grupo de privilegios a los que se les asigna un nombre.
Mediante los roles 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.
Existen roles predefinidos por Oracle (CONNECT: incluye únicamente el privilegio CREATE SESSION, RESOURCE: incluye CREATE
CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE 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. SYS o SYSTEM lo poseen.
Normalmente se crea un rol y a posteriori se le asignan privilegios. Así, el grupo de usuarios pertenecientes a este rol adoptan sus
privilegios. Ejemplo:
- 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 Base de Datos.
- No forma parte de ningún esquema.

Los roles simplifican la gestión dinámica de los privilegios. Pueden activarse o desactivarse temporalmente. Disminuye el número de
GRANT almacenados en el diccionario de datos, mejorando la productividad.

PL/SQL
Incluido en ORACLE DATABASE SERVER, tiene las siguientes características:
- Integrado con SQL
- Control de errores y excepciones
- Uso de variables
- Estructuras de control de flujo
- Soporta programación orientada a objetos
- Programación modulas: procedimientos y funciones

Intérprete de comandos: ORACLE. SQL*Plus Aplicación cuya única misión es enviar comandos al SGBD y mostrar los resultados
devueltos, en pantalla.

BLOQUES  Forma más básica de programar en PL/SQL. No se almacenan en la base de datos.

Definición:
Declaraciones (opcional)
Ejecutable (requerida)
Excepciones (opcional)
Los bloques PL/SQL pueden ser bloques anónimos, procedimientos o funciones, con el objetivo de conseguir modularidad.

Declaración de variables:

 IN: Opción por defecto. Valor de entrada.


Su valor no cambia.
 OUT: Valor de salida de programa sin
error.
 IN OUT: Variable de entrada y salida.
CONSTANT  Declara la variable como
constante. Debe ser inicializada.

Tipos:
 Compuesto: tablas, registros, tablas
anidadas y arrays.
 LOB: Bloques de datos no estructurados
como gráficos, imágenes, vídeos y texto
de hasta 4GB.

3
 Escalar:

Existen otras variables QUE NO


SON PL/SQL y podemos clasificar
en:
 BIND
 HOST

Operadores:

ESTRUCTURAS DE CONTROL DE FLUJO


LOOP Debe incluir siempre la condición de salida.. con WHEN o con IF
y utilizando siempre la cláusula EXIT:

FOR
Índice  NO hace falta declararlo, ya que lo hace implícitamente al usar la estructura FOR, pero no se puede usar fuera de él.

Reverse recorre el bicle en el sentido inverso, decrementando el valor del índice.

4
PROCEDIMIENTOS Y FUNCIONES
Definición:
Especificación (nombre y tipo de argumentos). En el caso de las funciones, también se especifica el valor devuelto.
Cuerpo Formado por sentencias PL/SQL que realizarán el objetivo para el cuál se crea el procedimiento o función.

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.
Parámetro actual: Son los valores que tienen los parámetros cuando se llaman a una función y que se asigna, en la invocación, a los
parámetros formales.
La diferencia entre procedimiento y función está en que 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, usará la palabra reservada RETURN.

Llamada:
EXECUTE nombre_procedimiento();
CALL nombre_procedimiento();
O, dentro de un bloque:

BEGIN
Nombre_procedimiento [{parámetros}];
END;

CONTROL DE ERRORES

Excepción: Resultado que se obtiene tras ejecutar un bloque PL/SQL que posee un error.
La llamada al tratamiento de excepciones puede producirse de dos formas:

 Ocurre un error y la excepción se lanza de forma automática.


 Se lanza la excepción de forma explícita usando la sentencia RAISE.

TIPOS
- EXCEPCIONES ORACLE PREDEFINIDAS: Lanzadas por Oracle de forma automática.

5
Ejemplo:
Con SQLCODE, mostraríamos el código del error Oracle y SQLERRM
devuelve el correspondiente mensaje de error. Se suelen utilizar, por
ejemplo, con WHEN OTHERS THEN:

- EXCEPCIONES ORACLE NO PREDEFINIDAS:


 Se declaran en la sección declarativa, DECLARE  CLÁUSULA EXCEPTION + CLÁUSULA PRAGMA
 Para localizar estas excepciones, se puede visitar la web de Oracle: SEARCH FOR ERROR MESSAGES:

https://docs.oracle.com/pls/db92/db92.error_search?remark=homepage&prefill=ORA-
 Para poder manejarlas, lo primero que hay que hacer es crear un objeto tipo EXCEPTION;

 A continuación se utiliza la cláusula “PRAGMA”, para


relacionar el objeto excepción que se ha creado, con el
número de error concreto.

PRAGMA EXCEPTION_INIT (MI_EXCEP, -937);

 Finalmente, el manejo de la excepción se hace en el bloque


de Excepciones, visto anteriormente, especificando
directamente la excepción por su nombre personalizado.

- ERRORES DEFINIDOS POR EL USUARIO:


 Se declaran en la sección declarativa, DECLARE  CLÁUSULA EXCEPTION.
 Se provocan explícitamente en la sección EJECUTABLE  RAISE.
 Se gestiona la excepción dentro del bloque de excepciones EXCEPTION.
- RAISE_APPLICATION_ERROR:
Permite devolver un error personalizado y cortar el programa.
Tiene dos argumentos. El primero es el código del error, que debe estar entre -20000 y -20999:

RAISE_APPLICATION_ERROR(-20001, ‘La ID no puede ser mayor de 100’);

En este caso, no hay zona de Exceptions. Aplica directamente.

ÁMBITO DE LAS EXCEPCIONES


Las excepciones del padre, valen para el hijo, pero las del hijo, no valen para el padre. (Similar a las variables).
Una excepción no controlada en el bloque hijo, se comprobará automáticamente entre las excepciones del padre, y si el padre no la
controla, en algún momento dará un error el programa.

6
AMPLIACIÓN SQLCODE Y SQLERRM:
Puesto que son funciones PL/SQL, no podríamos insertar sus valores dentro de una tabla (para guardar los errores) directamente, sino
que habría que crear variables donde almacenar esos valores y luego, insertar las variables en la tabla.

GESTIÓN DEL CÓDIGO A TRAVÉS DE LAS EXCEPCIONES

A través de las Exceptions, podemos hacer gestión del código. En el


ejemplo, comprobamos si existe (en cuyo caso, muestra un mensaje
de ‘La región ya existe’ y es si no lo localiza, es en el bloque de
Exceptions, cuando ejecuta la inserción del registro.

CURSORES Y TRANSACCIONES Los cursores NO permiten ir hacia adelante y hacia atrás.


Los CURSORES son estructuras que nos permiten recorrer la salida de una consulta realizada o dicho de otra forma, es un conjunto de
registros (fragmentos de memoria) devueltos por una consulta SELECT, de SQL.
 CURSORES IMPLÍCITOS:  SELECT INTO (No necesitan declaración)
- Con cada cursor implícito debe existir la palabra clave INTO.
- Las variables que reciben los datos devueltos por el cursor deben ser del mismo tipo de dato que las columnas de la tabla.
- Debe devolver un único registro (máximo 1 y mínimo 1). De otra forma, lanzará una Exception.
- Las excepciones más comunes son: no_data_found y too_much_rows.

ATRIBUTOS DE LOS CURSORES (IMPLÍCITOS)


SQL%ISOPEN -- sólo para cursores explícitos. En el caso de cursor implícito, siempre devolverá false --
SQL %FOUND -- indica si la operación del cursos ha devuelto o no, filas. --
SQL %NOTFOUND -- lo contrario --
SQL %ROWCOUNT -- indica el número de filas que han sido afectadas por ese cursor –
SQL es el nombre que se les pone a los cursores implícitos. En este caso, el atributo se refiere siempre al último ‘select’.

EJEMPLO:
Como put_line no admite booleanos, se puede utilizar un IF, para SQL%FOUNF / SQL%NOTFOUND.

 CURSORES EXPLÍCITOS:  Declarados y controlados por el programador cuando una consulta devuelve un conjunto de
registros. Puede ser a través de una consulta SELECT o bien por manipulación de datos con sentencias UPDATE o INSERT.
Algunas veces se utilizan con consultas de un único registro, por razones de eficiencia. Son más rápidos.
Se utilizan cuando se requiere tratamiento fila a fila y en sentencias SELECT que devuelven más de una fila.
- El cursor debe ser declarado antes de su uso. Debe tener un nombre y una consulta asociada determinada.
- Posteriormente, se debe recorrer el cursor hasta encontrar la información que interese o hasta que no haya más filas. Para ello,
habrá que declarar una variable “registro” de tipo “Rowtype” abrir el cursor, recorrerlo con un bucle for, realizando el FETCH
sobre la variable registro en cada iteración y finalmente, cerrando el cursor.

7
ESQUEMA CURSOR EXPLÍCITO:

BBDD Fin Sí
Declarar Abrir el cursor Leer fila del cursor Cerrar el cursor
?

No

ATRIBUTOS DE LOS CURSORES (EXPLÍCITOS)


nombreCursor %ISOPEN
nombreCursor %FOUND
nombreCursor %NOTFOUND
nombreCursor %ROWCOUNT

Una vez lee una fila, se queda el cursor en la siguiente, por lo que podemos utilizar bucles para trabajar varios registros.

RECORRER UN CURSOR CON BUCLE LOOP OJO: RECORDAR SIEMPRE INCLUIR CONDICIÓN DE SALIDA!!

RECORRER UN CURSOR CON BUCLE FOR

Recorrer un cursor con bucle FOR es MUCHO MÁS SENCILLO, porque hay comandos implícitos en el propio FOR.. de esta forma,
no hay que abrir/cerrar el cursor, ni hace falta crear una variable que almacene los registros, pues se almacenan en i, es decir, se hace
automáticamente un FETCH INTO i.

Como diferencia, señalar que la variable del FOR, i, es privada, por lo que sólo se puede manejar el cursor dentro del bucle.
CREACIÓN DE CURSOR DENTRO DEL PROPIO BUCLE FOR

CURSORES CON PARÁMETROS

Son cursores más dinámicos.

CURSORES DE ACTUALIZACIÓN: UPDATES Y DELETES con WHERE CURRENT OF

Una de las características que tiene los cursores es la capacidad de modificar ‘al vuelo’ la fila donde se encuentra el cursor con
UPDATE o con DELETE. Si éste es el objetivo, el cursor debe crearse desde un inicio, con la cláusula FOR UPDATE.

FOR UPDATE sirve para bloquear las filas mientras son modificadas. Si no se bloquean, para cuando se llega al bucle, pueden haber
sido bloqueadas por otros usuarios y arrojar un error.

Ver ejemplo en la siguiente página.


8
Cuando trabajamos con cursores, hay que tener en cuenta...

 Cuando un cursor está cerrado, no se puede leer.


 Cuando leemos un cursor, debemos comprobar el resultado de la lectura utilizando los atributos del cursor.
 Cuando se cierra el cursor, es ilegal tratar de usarlo o tratar de cerrarlo de nuevo.

ENTRADA Y SALIDA DE DATOS:


SALIDA

SET SERVEROUTPUT ON  Para visualizar la información enviada a la pantalla. Sólo activamos esta variable una vez.
dbms_output.put_line  Para enviar información a la pantalla.

ENTRADA

nombreVariable := &Texto_para_mostrar;  El texto a mostrar debe ser una cadena de texto sin espacios en blanco.
Recomendable separar las palabras con guiones bajos.

TRIGGERS:

Son módulos PL/SQL compilados y almacenados en la BD, que tienen asociada una tabla y que se ejecuta al llevar a cabo una
instrucción SQL. Se utilizan para:

 Forzar reglas de integridad difíciles de definir a partir de constraints.


 Realizan cambios en la base de datos, de forma transparente al usuario.
 Sincronizar el mantenimiento de tablas duplicadas, localizadas en distintos nodos de una base de datos distribuida.
 Generar automáticamente valores de columnas derivadas, en base a un valor proporcionado por una sentencia.

TIPOS (según momento en el que se disparan)


 BEFORE: En operaciones de control, por ejemplo.
 AFTER: Auditorías.

9
Un trigger puede dispararse por más de una operación, en cuyo caso, utilizaremos los predicados condicionales INSERTING,
DELETING, UPDATING (y UPDATING(columna)), para controlar el tipo de evento.

TRIGGERS TIPO ROW: Como se disparan por fila, se puede acceder a los datos de la fila.

Tendremos dos tipos de datos… los :OLD y los :NEW.


Se accede al valor antiguo como :OLD.REGION_NAME y al nuevo como
:NEW.REGION_NAME.
De esta forma, se puede controlar el trigger, ya no sólo por el tipo, sino por el valor
que pueda tener una fila.

Los triggers de tipo row son, por lo tanto útiles, no para controlar
la operación, sino para controlar los datos que se están manejando
dentro de la operación.

CLAÚSULA WHEN: La cláusula WHEN se puede utilizar para poner una condición que determine en qué circunstancias debe
dispararse el trigger.

ALGUNAS FUNCIONES A SABER..


SYSDATE  Fecha diaria.
ROWID  Identificador de la fila.
USER  Usuario del sistema de BBDD.
NLS_SESSION_PARAMETERS  Parámetros de sesión.
DUAL  Tabla del sistema donde encontramos la fecha y otros parámetros.
10
UF4: BASES DE DATOS OBJETO-RELACIONALES
La mayor diferencia entre las bases de datos relacionales y las objeto relacionales es la existencia de tipos de objetos.
Los tipos se crean mediante sentencias ODL (Object Definition Language).

OBJETO
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 datos de ese tipo escritos en PL/SQL.

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 (multivaluados, arrays...), lo cual, contradice
algunas de las restricciones establecidas por el modelo relacional.

Las bases de datos objeto-relacionales se caracterizan porque se basan en una programación orientada a objetos (POO) que
se desarrolla basándose en tres elementos fundamentales:
Encapsulamiento: Mecanismo que vamos a seguir para agrupar los atributos y métodos dentro de un nuevo concepto que
denominamos clase.
Herencia: Mecanismo por el cual una clase derivada va a heredar los atributos de otra.
Polimorfismo: Cuando una clase derivada debe verse como la clase principal. (Permite sobrecarga)

TIPOS DE DATOS OBJETO


Los objetos han entrado en el mundo de las bases de datos en forma de dominios, actuando como el tipo de dato de una columna
determinada.
Dos implicaciones por el hecho de utilizar una clase como dominio:
Es posible almacenar múltiples valores en una columna de una misma fila ya que un objeto suele contener múltiples valores.
Es posibles almacenar procedimientos en las relaciones porque un objeto está enlazado con el código de los procesos que sabe
realizar (los métodos de su clase).
La base de datos sigue sujeta a las restricciones que se aplican a todas las bases de datos relacionales y conserva la capacidad de
utilizar operaciones de concatenación (JOIN)

Definición de tipos de objeto: Los usuarios pueden definir sus propios tipos de datos a partir de los tipos básicos provistos
por el sistema o por otros predefinidos anteriormente.
Para poder crear tipos de objetos se debe hacer uso de la sentencia CREATE TYPE. Está compuesta por los siguientes elementos:

 Nombre.
 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.
 Métodos: Procedimientos o funciones. Se declaran con la
cláusula MEMBER.
 Directiva: PRAGMA_REFERENCES.

Definición de métodos

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 base de datos.


 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. Las restricciones son:

 WINDS: evita que el método pueda modificar las tablas de la base de datos.
 RNDS: evita que el método pueda leer las tablas de la base de datos.
 WNPS: evita que el método modifique variables del paquete PL/SQL.
 RNPS: evita que el método pueda leer las variables del paquete PL/SQL.

11
CUERPO de tipos de objeto
EJEMPLO DEFINICIÓN + CUERPO: OBJETO PERSONA:

DEFINICIÓN:

CUERPO:

Una vez definida la clase y el cuerpo, podemos utilizar este objeto como si de un tipo cualquier se tratase:

COLECCIONES
Para poder contar con atributos multivaluados (1:N) es necesario que los organicemos en una estructura de datos (array).
Estas colecciones de datos las podemos generar de un tipo de dato (Number, Varchar2, etc…) o sobre un tipo de objeto.

Estas colecciones de datos las podemos utilizar en la definición de una clase (objeto) o como definición de un campo de una tabla.

TABLAS DERIVADAS DE OBJETOS

De la misma forma que creamos objetos haciendo uso de los tipos definidos, también podemos
hacerlo con las tablas:
Para hacer un Insert indicaremos el tipo de objeto que estamos insertando:

Para hacer un insert


debemos indicar el tipo de objeto que estamos
insertando:

12
HERENCIA
Una de las principales ventajas de la programación orientada a objetos (POO) es la herencia, que permite crear superclases abstractas
para que, en adelante, se puedan crear subclases más específicas que hereden atributos y métodos de las superclases.
En las bases de datos objeto-relacionales, el supertipo define los atributos o métodos que van a compartir con los subtipos, todos los
objetos que hereden de él. Los subtipos también pueden definir sus propios atributos y métodos.

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 compilará el objeto.

TIPO PERSONA (SUPERTIPO) TIPO EMPLEADO (SUBTIPO): Utilizamos la cláusula UNDER

*Heredamos los atributos y los métodos añadiendo características


propias de tipo_person y sobreescribimos el método printme.

IDENTIFICADORES, REFERENCIAS
El tipo REF o referencia es un contenedor de un identificador de objeto (object identifier - OID).
Es un puntero a un objeto.

Con la palabra reservada DEREF obtenemos el valor del objeto al que apunta dicha referencia.

TIPOS DE DATOS COLECCIÓN


Se definen para poder implementar 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 un índice que indica la
posición que ocupa en el array.

Así definimos el tipo de datos colec_telefono, que va a tener un máximo de


10 valores de 30 caracteres.

Creamos un tabla para representar la siguiente estructura:

La forma de insertar datos exige especificar el tipo colec_telefono, para que el SGBD realice las comprobaciones oportunas:

TABLAS ANIDADAS
Una tabla es un conjunto de elementos del mismo tipo. NO EXISTE UN ORDEN PREDEFINIDO.
RESTRICCIONES: Sólo pueden tener UNA SOLA COLUMNA. El tipo de datos puede ser básico o definido por el usuario.

Las columnas que son tablas anidadas junto con los atributos 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 realiza
igual que con las colecciones.

 AHORA LA tabla_teléfono YA NO ES TIPO COLECCIÓN SINOTIPO TABLA.


13
DECLARACIÓN E INICIALIZACIÓN DE OBJETOS
Para declarar un objeto en la base de datos Oracle tenemos que crear un nuevo tipo de datos.

Podemos hacerlo de dos formas:

 Mediante SQL Developer podemos conectarnos a una base de datos ya creada en Oracle y, a partir de ahí, seleccionamos
el panel de conexiones, Types:

 De forma más directa, mediante CREATE TYPE:


La definición de object_type se corresponde con:

INSERT
A través del comando INSERT directamente o utilizando el constructor:

Ejemplo de inserción en la tabla relacional departamento, de un registro que incluye una columna de tipo “person”:

UPDATE DELETE

14

También podría gustarte