Documentos de Académico
Documentos de Profesional
Documentos de Cultura
relacional bá sico
Cada aplicación de base de datos se crea sobre un conjunto de objetos de base
de datos relacionados que almacenan los datos de la aplicación y permiten
funcionar a la aplicación. Este capítulo introduce los objetos de base de datos de
Oracle, como las tablas y explica los conceptos lógicos de los objetos de base de
datos. Los temas que se explican en este capítulo son:
Esquemas.
Tablas.
Restricciones de integridad.
Vistas.
Secuencias.
Sinónimos.
Índices.
Los capítulos de siguientes de este libro explican mas sobre como Oracle
puede organizar físicamente el almacenamiento de objetos de base de datos
usando estructuras de almacenamiento físicas.
Figura 7.2. Una tabla es un conjunto de registros con los mismos atributos.
Cada registro de cliente en una tabla CUSTOMERS de ejemplo tiene los mismos
atributos, incluyendo un ID, un nombre de organización, un apellido, un nombre,
etc.
Cuando se crean tablas, las dos cosas principales que debe considerar son las
siguientes:
Las columnas de la tabla, que describen la estructura de la tabla.
Las restricciones de integridad de la tabla, que describen los datos que son
validos dentro de la tabla
Las siguientes secciones explican más sobre columnas y restricciones de
integridad.
Es decir, cuando las cadenas de una columna tienen una longitud variable,
Oracle puede almacenarlas de forma más eficaz en una columna
VARCHAR2 que es una columna CHAR. Oracle también usa diferentes
técnicas para comparar entre sí cadenas CHAR y VARCHAR2, con el fin que
las expresiones de comparación se evalúen como se espera.
Una tabla puede tener varias columnas CLOB, BLOB y BFILE. Por el
contrario, una tabla solo puede tener una columna LONG o LONG
RAW.
Una tabla solo almacena localizadores (punteros) para los LOB de una
columna, en lugar de los propios objetos grandes. Por el contrario, una
tabla almacena datos para una columna LONG dentro de la propia
tabla.
NOTA: Los ejemplos de esta sección introducen los fundamentos del comando
CREATE TABLE. Los siguientes ejercicios de este y otros capítulos explican
clausulas y parámetros más avanzados del comando CREATE TABLE.
EJERCICIO 7.2: Modificar y agregar columnas a
una tabla
Después de crear una tabla, se puede modificar su estructura usando el comando
ALTER TABLE de SQL. Por ejemplo, puede que se quiera cambiar el tipo de datos
de una columna, cambiar el valor de la columna de la columna predeterminada o
agregar una columna completamente nueva. En este ejercicio, la sintaxis básica
del comando ALTER TABLE para agregar o modificar una columna en una tabla
de una base de datos relacional es la siguiente:
Por ejemplo, introduzca la siguiente sentencia ALTER TABLE, que modifica el tipo
de datos de la columna ZIPCODE en la tabla CUSTOMERS que creó en el
Ejercicio 7.1.
NOTA: Los ejemplos de esta sección explican los fundamentos del comando
ALTER TABLE. Los siguientes ejercicios de este capítulo muestran clausulas y
parámetros más avanzados del comando ALTER TABLE.
Integridad de datos y restricciones de integridad
La integridad de los datos es un principio fundamental del modelo de la base
de datos relacional. Decir que una base de datos tiene integridad es otra
forma de decir que la base de datos contiene solo información exacta y
aceptable. Por razones obvias, la integridad de los datos es un atributo
deseable para una base de datos.
Además de usar los tipos de datos de las columnas, Oracle soporta dos tipos
de restricciones de integridad que permiten limitar todavía más el domino de
una columna:
Figura 7.3. La integridad referencial describe las relaciones entre las columnas y
tablas de una base de datos relacional.
Acciones referenciadas
La integridad referencial asegura que cada valor de una clave externa
siempre tiene un valor clave padre que coincide. Para garantizar la integridad
referencial, un RFBMS desde también ser capaz de direccionar las
operaciones de bases de datos que manipulan clavas padre. Por ejemplo,
cuando un usuario elimina en pedido de ventas, ¿qué sucede con los
elementos dependientes de dicho pedido? Las acciones referenciales
describen que hacer en los casos en que una aplicación actualice o elimine
una clave padre que tiene registros hijos dependientes.
Tenga en cuenta que se puede declarar una restricción de integridad a la vez que
se declara una columna, o puede declarar una restricción de integridad
independiente de la declaración de una columna especifica. En general, siempre
puede elegir la opción que quiera para crear una restricción, excepto en las
siguientes situaciones:
Para declarar una columna con una restricción no nula, debe realizarlo
como parte de la declaración de la columna
Para declarar una restricción de integridad de clave principal compuesta,
única o referencial, debe declarar la restricción de forma independiente de
la declaración de una columna específica.
Introdúzcala siguiente sentencia CREATE TABLE para crear la tabla ya conocida
ORDERS con algunas restricciones de integridad.
Por ejemplo, las tablas PARTS y CUSTOMERS que se crearon en el Ejercicio 7.1
no tienen claves principales, introduzca los siguientes comandos para agregar
restricciones de clave principal para estas tablas.
Por ejemplo, cada registro de la tabla ORDERS necesita un campo para hacer un
seguimiento del ID del cliente que hace el pedido. Para agregar esta columna,
introduzca la siguiente sentencia, que agrega la columna C_ID a la tabla
ORDERS, junto con una restricción de integridad ni nula y referencial.
COMMIT;
Ahora, vamos a probar una restricción de integridad referencial y ver qué sucede.
Introduzca las siguientes sentencias, que insertan algunos registros en la tabla
CUSTOMERS.
COMMIT;
EJERCICIO 7.10: Declarar y usar una restricción
diferida
Todas las restricciones que se han especificado en los Ejercicios 7.3 hasta el 7.8
se imponen inmediatamente conforme se ejecuta cada sentencia SQL. El ejercicio
anterior muestra esta imposición inmediata de las restricciones, cuando se intenta
insertar una fila que no tiene un valor de clave principal única en la tabla PARTS,
Oracle impone inmediatamente la restricción restaurando la sentencia INSERT y
devolviendo un error.
Ahora, confirme la transacción con una sentencia COMMIT, para ver qué ocurre.
Oracle debería devolver los siguientes mensajes de error:
COMMIT;
Vistas
Una vez definidas las tablas de una base de datos, puede centrarse en otros
aspectos relativos a la mejora del uso del esquema de la aplicación. Puede
comenzar definiendo vistas de las tablas del esquema. Una vista es un objeto de
base de datos que presenta datos en la tabla ¿Por qué y cómo usará las vistas
para presentar los datos de la tabla?
Puede usar una vista simple para mostrar todas las filas y todas las
columnas de una tabla, y ocultar el nombre de la tabla subyacente por motivos
de seguridad. Por ejemplo, puede crear una vista llamada CUST que muestre
todos los registros de cliente de la tabla CUSTOMERS.
Puede usar una vista para proteger la seguridad de datos específicos de la
tabla mostrando solo un subconjunto de las filas y/o de las columnas de una
tabla. Por ejemplo, puede crear una vista llamada CUST_CA que muestre solo
las columnas LASTNAME, FIRSTNAME y PONE de la tabla CUSTOMERS
para clientes que residen en el estado de California.
Puede usar una vista para simplificar la codificación de aplicaciones. Una
visa compleja puede unir los datos de tablas padre e hija relacionadas para
hacerlas aparecer como si existiese una tabla diferente en la base de datos.
Por ejemplo, puede crear una vista llamada ORDER_ITEMS que une registros
relacionados en las tablas ORDERS e ITEMS.
Puede usar una vista para mostrar datos derivados que no están realmente
almacenados en una tabla. Por ejemplo, puede crear una vista de la tabla
ITEMS con una columna llamada TOTAL que calcula el total de cada registro.
Como se puede ver en esta lista, las vistas proporcionan unos medios flexibles de
mostrar los datos de la tabla en una base de datos. De hecho, puede crear una
vista de cualquier dato que pueda representar con una petición SQL. Esto es así
porque una vista es realmente sólo una petición que Oracle almacena como un
objeto e esquema. Cuando una aplicación usa una vista para hacer algo, Oracle
deriva los datos de la visa basándose en la consulta de definición de la vista. Por
ejemplo, cuando una aplicación hace una petición a la vista CUST_CA que se
describe en la lista anterior, Oracle procesa la petición con los datos descritos por
la consulta de definición de la vista.
Creación de vistas
Para crear una vista, use el comando CREATE VIEW de SQL. A continuación se
muestra un listado abreviado de la sintaxis del comando CREATE VIEW:
Las siguientes secciones y ejercicios prácticos explican algo más sobre los tipos
específicos de vistas que soporta Oracle8i, y proporcionan ejemplo de uso de
varias cláusulas, parámetros y opciones del comando CREATE VIEW.
Tenga en cuenta los siguientes aspectos sobre este primer ejemplo del comando
CREATE VIEW
La cláusula AS del comando CREATE VIEW especifica la consulta de
definición de la vista. El conjunto resultado de una consulta de definición de
la vista determina la estructura de la vista (columnas y filas).
Para crear una vista de sólo lectura, se debe especificar la opción UIT
READ ONLY del comando CREATE VIEW para declarar explícitamente que
la vista es de solo lectura; en caso contrario, Oracle crea la vista como una
vista actualizable.
Vistas actualizables
Oracle8i también permite definir vistas actualizables que puede usar una
aplicación para insertar, actualizar y eliminar datos de la tabla o hacer peticiones
de datos.
EJERCICIO 7.12: Crear una vista actualizable
Para crear una vista como una vista actualizable, simplemente omita la opción UIT
READ ONLY del comando CREATE VIEW cuando se crea la vista. Por ejemplo,
introduzca la siguiente sentencia CREATE VIEW, que crea una vista de unión
actualizable de las tablas ORDERS y PARTS.
Ahora, haga peticiones a las tablas ORDERS e ITEMS para ver que el disparador
funciona como se pensó
Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
Tabla modificada.
1 fila actualizada.
Tabla modificada.
Pero hay que tener en cuenta que una fila de una ‘key-preserved table’ SÍ PUEDE
actualizar más de una fila de la otra tabla:
Tabla modificada.
Tabla modificada.
1 fila creada.
ID_N C_TXT
---------- -------------------------
1 UNO
1 ONE
2 filas actualizadas.
ID_N C_TXT
---------- -------------------------
1 UNO
1 UNO
Nota: El ‘hint’ BYPASS_UJVC evita toda la comprobación por parte del
optimizador de las ‘key-preserved tables’, pero es un ‘hint’ indocumentado y -en
teoría- los mortales no deberíamos utilizarlo, o hacerlo ‘bajo nuestra propia
responsabilidad’…
ID_N C_TXT
---------- -------------------------
1 UNO
ID_N C_TXT
---------- -------------------------
1
Tabla modificada.
Tabla modificada.
1 fila actualizada.
Secuencias
Una aplicación OLTP, como un sistema de reservas de líneas aéreas, suele
soportar un gran número de usuarios concurrentes. A medida que la transacción
de cada usuario inserta una o más filas nuevas en varias tablas de la base de
datos, coordinar la generación de claves principales únicas entre múltiples
transacciones concurrentes puede ser un reto importante para la aplicación.
Afortunadamente, Oracle8i tiene una característica que hace la generación de
valores únicos sea una cuestión trivial. Una secuencia es un objeto de esquema
que genera una serie de enteros únicos y solo es apropiada para tablas que usen
columnas simples numéricas como claves, como las columnas ID que se usan en
todas las tablas de nuestro esquema de práctica. Cuando una aplicación inserta
una fila nueva en una tabla, la aplicación simplemente solicita una secuencia de
base de datos para proporcionar el siguiente valor disponible en la secuencia para
el valor de la clave principal de la nueva fila. Además, la aplicación puede volver a
usar posteriormente una secuencia generada para coordinar los valores de las
claves externas en filas hijas relacionadas. Oracle administra la generación de
secuencia con una sobrecarga insignificante, permiten incluso a las aplicaciones
de procesamiento de transacciones en línea (OLTP) que demandan muchos
recursos realizar bien su trabajo
Crear y administrar secuencias
Para crear una secuencia, se usa el comando SQL CREATE SEQUENCE.
NOTA Una pseudocolumna se parece a una columna de una tabla. Las sentencias SQL
pueden referenciar pseudocolumnas para recuperar datos, pero no pueden insertar,
actualizar o eliminar datos haciendo referencia a una pseudocolumna
NOTA Una vez que la sesión genera un Nuevo número de secuencia, solo la sesión
puede volver a usar el número de secuencia; otras sesiones que generen los números de
secuencia con la misma secuencia reciben números de secuencia consecutivos de su
propiedad.
COMMIT;
Secuencias en Oracle11g
Oracle incluye nuevas características para PL/SQ en la base de datos 11g. Estas
no ofrecen nuevas funcionalidades, sino que proveen un mejor funcionamiento, de
una codificación más simple, y de mayor legibilidad.
CONTINUE Statement
Finalente, PL/SQL tiene un Statement CONTINUE para sus loops. Sintacticamrnte
este is igual como el Statement EXIT, y este habilita una clausula opcional WHEN
y un label (etiquetado). En el siguiente ejemplo, una interfaz de tabla está
preguntando y grabando sus flagged como comentarios saltados.
LOOP
FETCH cur BULK COLLECT INTO rows;
EXIT WHEN rows.COUNT=0;
FOR I IN 1..rows.COUNT LOOP
CONTINUE WHEN NOT EVALUATORS.single_line_comment(rows(i));
-- process responsive data
...
END LOOP;
END LOOP;
Para las filas del comentario, el control se mueve al final del loop, y se
procesa el siguiente.
DECLARE
new_Val NUMBER;
BEGIN
new_Val := my_sequence.nextval;
...
END;
It couldn’t be simpler.
Sinónimos
Crear sinónimos
El resultado es el siguiente:
ID LASTNAME
---- --------
1 Joy
2 Musial
Índices
NOTA Esta sección introduce los índices para dar soporte a las secciones posteriores de
este libro. Si desea información completa sobre los diferentes tipos de índices que
soporta Oracle y otros temas relacionados con el rendimiento, consulte el Capitulo 12
Las aplicaciones pueden acceder a los datos de tablas con o sin índice
asociados.
Cuando existe un índice y ayuda al rendimiento de la petición de una
aplicación, Oracle usa automáticamente el índice; si no es así, Oracle
ignora el índice.
Oracle actualizar automáticamente un índice para mantenerlo sincronizado
con su tabla.
Índice de árbol-B
Un índice de árbol-B contiene una entrada para cada gila de la tabla, a no ser que
la entrada de índice para una fila sea nula. La figura 7.4 muestra un índice típico
de árbol-B.
A la hora de usar un índice árbol-B, Oracle desciende por el árbol de nodos índice
buscando valores de índice buscando valores de índice que coincidan con el
criterio de selección de consulta. Cuando encuentra una coincidencia, Oracle usa
el ROWID correspondiente para localizar y leer los datos de la fila de la tabla
asociada desde el disco
Usar índices de árbol-B de forma adecuada
Los índices de árbol-B no son adecuados para todos los tipos de aplicaciones y
todos los tipos de columnas de una tabla. En general, los índices de árbol-B son
la mejor elección para aplicaciones OLTP en las que se insertan, actualizan y
eliminan datos constantemente. En tales entornos, los índices de árbol-B
funcionan mejor para columnas clave que contienen muchos valores distintos
relativos al número total de valores clave de la columna. Las claves principales y
alternativa de una tabla son ejemplos perfectos de columnas que deberían tener
índice de árbol-B. Convenientemente, Oraclave8i crea índices de árbol-B de forma
automática para todas las restricciones de integridad de clave principal y única de
una tabla.
NOTA Las versiones de Oracle anteriores Oracle8i soportaban la palabra clave DESC
para crear un índice de árbol-B, pero siempre creaban índices ascendentes. Oracle8i
también soporta ahora índices descendentes.
EJERCICIO 7.18: Crear un índice de árbol-B
Para facilitar uniones más rápidas entre las tablas ITEMS y PARTS, introduzca el
siguiente comando, que crea un índice de árbol-B para las columnas en la
columna de clave externa PART_FK de la tabla ITEMS.
Un índice invisible puede volverse visible sin costo alguno, con una simple
alteración del mismo: ALTER INDEX mi_indice VISIBLE. Un índice unusable
en cambio deberá ser reconstruído, ya que las actualizaciones de datos sobre la
tabla no fueron reflejadas mientras el índice estuvo en ese estado. Los índices
invisibles SIEMPRE son mantenidos por Oracle con cada sentencia DML.
Con estas afirmaciones, podemos concluir que los índices invisibles llegan para
sustituir el estado unusable?
Los índices invisibles son un valor agregado a nuestra forma de trabajo, ya que
nos proveen transparencia sobre el ambiente. Nos permiten realizar nuestras
pruebas tranquilos de que nadie está siendo afectado.
EJERCICIO EXTRA: Índice invisible
5.- Aunque utilicemos explicitamente el nombre del índice con un hint, este no será
utilizado
Todas las bases de datos Oracle usan unas cuantas tablas y vistas de sistema
para hacer un seguimiento de los metadatos, sobre los datos de una base de
datos. Esta colección de objetos del sistema se llama diccionario de datos de la
base de datos de Oracle o catalogo del sistema. Oracle organiza el diccionario de
datos de una base de datos dentro del esquema SYS.
A medida que se crea y administran esquemas en una base de datos de Oracle,
es posible mostrar información sobre los objetos de esquemas asociados
realizando consultas a las tablas y las vistas del diccionario de datos. Por ejemplo,
la Tabla 7.3 proporciona una lista de las diferentes vistas del diccionario de datos
que corresponden a los objetos de esquema que se han explicado en este
capítulo.
Las vistas que empiezan con el prefijo “DBA_” muestran toda la información
en la correspondientes tablas de base del diccionario de datos Como las
vistas DBA son completas, solo pueden acceder a ellas los usuarios que
tienen el privilegio de sistema SELECT ANY TABLE.(consulte el capitulo 9
si desea más información sobre privilegios y seguridad débase de datos.)
Las vistas que empiezan con el prefijo “ALL_” están a disposición de todos
los usuarios y muestran aspectos específicos del dominio privilegiado del
usuario actual.
Las vistas que empiezan con el prefijo “USER_” están a disposición de
todos los usuarios y muestran aspecto específicos del usuario actual.
Tabla 7.3 Visitas del diccionario de datos que se corresponden con las
tablas, columnas, restricciones, vistas, secuencias, sinónimos e índice
DBA_TAB_COLUMNS, ALL_TAB_COLUMNS y
USER_TAB_COLUMNS muestran información sobre
las columnas de cada tabla de la base de datos
DBA_CONS_COLUMNS, ALL_CONS_COLUMNS y
USER_CONS_COLUMNS muestra información
sobre columnas y restricciones asociadas.
Vistas DBA_VIEWS, ALL_VIEWS y USER_VIEWS.
DESCRIBE user_constraints;
16 rows selected.
Tenga en cuenta que Oracle ha generado nombres únicos que empiezan con el
prefijo “SYS_” para todas las restricciones a las que no se le ha asignado un
nombre de forma explícita. La expresión DECODE en la clausula SELECT de la
consulta traduce los códigos de la columna CONSTRAINT_TYPE a información
legible.