miércoles, 13 de julio de 2011

Tablas

Introducción

Las tablas son la unidad básica de almacenamiento de datos en Oracle.

Los datos son almacenados en filas y columnas. Se define a través de:
◦Nombre.
◦Conjunto de columnas (nombre y tipo).

Al crear una tabla Oracle asigna un segmento de datos en el tablespace. Se puede controlar el espacio y el uso de ese segmento.

Tipos de Tablas:

  • Regulares.
    • Forma comúnmente usada para almacenar los datos.
    • Tipo por defecto.
    • Se tiene muy poco control sobre la distribución de las filas de la tabla en su almacenamiento físico:
  • Particionadas.
  • Organizadas por Índices.
  • Agrupadas (clusterizadas).

CREAR TABLAS



 
Nombre de las tablas

Deben cumplir las siguientes reglas (reglas de Oracle, en otros SGBD podrían cambiar):
♦ Deben comenzar con una letra
♦ No deben tener más de 30 caracteres
♦ Sólo se permiten utilizar letras del alfabeto (inglés), números o el signo de subrayado (también el signo $ y #, pero esos se utilizan de manera especial por lo que no son recomendados)
♦ No puede haber dos tablas con el mismo nombre para el mismo esquema (pueden coincidir los nombres si están en distintos esquemas)
♦ No puede coincidir con el nombre de una palabra reservada SQL (por ejemplo no se puede llamar SELECT a una tabla)
♦ En el caso de que el nombre tenga espacios en blanco o caracteres nacionales (permitido sólo en algunas bases de datos), entonces se suele entrecomillar con comillas dobles. En el estándar SQL 99 (respetado por Oracle) se pueden utilizar comillas dobles al poner el nombre de la tabla a fin de hacerla sensible a las mayúsculas (se diferenciará entre “FACTURAS” y “Facturas”)

orden CREATE TABLE

Es la orden SQL que permite crear una tabla. Por defecto será almacenada en el espacio y esquema del usuario que crea la tabla. Sintaxis:
CREATE TABLE [esquema.] nombreDeTabla
(nombreDeLaColumna1 tipoDeDatos [, ...]);
Ejemplo:

CREATE TABLE proveedores (nombre VARCHAR(25));

Crea una tabla con un solo campo de tipo VARCHAR.
Sólo se podrá crear la tabla si el usuario posee los permisos necesarios para ello. Si la tabla pertenece a otro esquema (suponiendo que el usuario tenga permiso para grabar tablas en ese otro esquema), se antepone al nombre de la tabla , el nombre del esquema:

CREATE TABLE otroUsuario.proveedores (nombre VARCHAR(25));

create table facturas (
 clave char (10) primary key,
 codigocliente number (9,2) not null,
 importetotal number (10,2),
 baseimponible number (10,2),
 importeiva number (10,2),
 porcentajeiva number (2,0),
 observacion varchar2 (2000),
 documentacion clob,
 ficheroescaneado blob,
 fechaalta date default sysdate,
 fechavencimiento date,
 serie varchar2(10) 
)

Tipos de Datos

Les mostramos los tipos de datos / datatypes disponibles en Oracle para seleccionar el tipo de registro de una tabla Oracle. Tamibén indicamos sus características (tamaño máximo, peculiaridades, etc). Es importante conocer los tipos de datos disponibles en un Sistema Gestor de Base de Datos (SGBD), de esta forma podremos obtimizar al máximo el uso de recursos de nuestras aplicaciones. A continuación os indicamos todos los tipos de datos de Oracle y sus características básicas:

TIPO
CARACTERISTICAS
OBSERVACIONES
CHAR
Cadena de caracteres (alfanuméricos) de longitud fija
Entre 1 y 2000 bytes como máximo. Aunque se introduzca un valor más corto que el indicado en el tamaño, se rellenará al tamaño indicado. Es de longitud fija, siempre ocupará lo mismo, independientemente del valor que contenga
VARCHAR2
Cadena de caracteres de longitud variable
Entre 1 y 4000 bytes como máximo. El tamaño del campo dependerá del valor que contenga, es de longitud variable.
VARCHAR
Cadena de caracteres de longitud variable
En desuso, se utiliza VARCHAR2 en su lugar
NCHAR
Cadena de caracteres de longitud fija que sólo almacena caracteres Unicode
Entre 1 y 2000 bytes como máximo. El juego de caracteres del tipo de datos (datatype) NCHAR sólo puede ser AL16UTF16 ó UTF8. El juego de caracteres se especifica cuando se crea la base de datos Oracle
NVARCHAR2
Cadena de caracteres de longitud variable que sólo almacena caracteres Unicode
Entre 1 y 4000 bytes como máximo. El juego de caracteres del tipo de datos (datatype) NCHAR sólo puede ser AL16UTF16 ó UTF8. El juego de caracteres se especifica cuando se crea la base de datos Oracle
LONG
Cadena de caracteres de longitud variable
Como máximo admite hasta 2 GB (2000 MB). Los datos LONG deberán ser convertidos apropiadamente al moverse entre diversos sistemas.

Este tipo de datos está obsoleto (en desuso), en su lugar se utilizan los datos de tipo LOB (
CLOB, NCLOB). Oracle recomienda que se convierta el tipo de datos LONG a alguno LOB si aún se está utilizando.

No se puede utilizar en claúsulas WHERE, GROUP BY, ORDER BY, CONNECT BY ni DISTINCT

Una tabla sólo puede contener una columna de tipo LONG.

Sólo soporta acceso secuencial.
LONG RAW
Almacenan cadenas binarias de ancho variable
Hasta 2 GB.

En desuso, se sustituye por los tipos LOB.
RAW
Almacenan cadenas binarias de ancho variable
Hasta 32767 bytes.

En desuso, se sustituye por los tipos LOB.
LOB (BLOG, CLOB, NCLOB, BFILE)
Permiten almacenar y manipular bloques grandes de datos no estructurados (tales como texto, imágenes, videos, sonidos, etc) en formato binario o del carácter
Admiten hasta 8 terabytes (8000 GB).

Una tabla puede contener varias columnas de tipo LOB.

Soportan acceso aleatorio.

Las tablas con columnas de tipo LOB no pueden ser replicadas.
BLOB
Permite almacenar datos binarios no estructurados
Admiten hasta 8 terabytes
CLOB
Almacena datos de tipo carácter
Admiten hasta 8 terabytes
NCLOB
Almacena datos de tipo carácter
Admiten hasta 8 terabytes.
Guarda los datos según el juego de caracteres Unicode nacional.
BFILE
Almacena datos binarios no estructurados en archivos del sistema operativo, fuera de la base de datos. Una columna BFILE almacena un localizador del archivo a uno externo que contiene los datos
Admiten hasta 8 terabytes.
El administrador de la base de datos debe asegurarse de que exista el archivo en disco y de que los procesos de Oracle tengan permisos de lectura para el archivo.
ROWID
Almacenar la dirección única de cada fila de la tabla de la base de datos

ROWID físico almacena la dirección de fila en las tablas, las tablas en clúster, los índices, excepto en las índices-organizados (IOT).

ROWID lógico almacena la dirección de fila en tablas de índice-organizado (IOT).

Un ejemplo del valor de un campo ROWID podría ser: "AAAIugAAJAAC4AhAAI". El formato es el siguiente:

Para "OOOOOOFFFBBBBBBRRR", donde:

OOOOOO: segmento de la base de datos (AAAIug en el ejemplo). Todos los objetos que estén en el mismo esquema y en el mismo segmento tendrán el mismo valor.

FFF: el número de fichero del tablespace relativo que contiene la fila (fichero AAJ en el ejemplo).

BBBBBB: el bloque de datos que contiene a la fila (bloque AAC4Ah en el ejemplo). El número de bloque es relativo a su fichero de datos, no al tablespace. Por lo tanto, dos filas con números de bloque iguales podrían residir en diferentes datafiles del mismo tablespace.

RRR: el número de fila en el bloque (fila AAI en el ejemplo).

Este tipo de campo no aparece en los SELECT ni se puede modificar en los UPDATE, ni en los INSERT. Tampoco se puede utilizar en los CREATE. Es un tipo de datos utilizado exclusivamente por Oracle. Sólo se puede ver su valor utilizando la palabra reservada ROWID, por ejemplo:


select rowid, nombre, apellidos from clientes

Ejemplo 2:

SELECT ROWID, SUBSTR(ROWID,15,4) "Fichero",  SUBSTR(ROWID,1,8) "Bloque",  SUBSTR(ROWID,10,4) "Fila" FROM proveedores


Ejemplo 3:
una forma de saber en cuántos ficheros de datos está alojada una tabla:

SELECT COUNT(DISTINCT(SUBSTR(ROWID,7,3))) "Numero ficheros " FROM facturacion
UROWID
ROWID universal
Admite ROWID a tablas que no sean de Oracle, tablas externas. Admite tanto ROWID lógicos como físicos.
NUMBER
Almacena números fijos y en punto flotante
Se admiten hasta 38 dígitos de precisión y son portables a cualquier entre los diversos sistemas en que funcione Oracle.

Para declarar un tipo de datos NUMBER en un CREATE ó UPDATE es suficiente con:

nombre_columna NUMBER

opcionalmente se le puede indicar la precisión (número total de dígitos) y la escala (número de dígitos a la derecha de la coma, decimales, los cogerá de la precisión indicada):

nombre_columna NUMBER (precision, escala)

Si no se indica la precisión se tomará en función del número a guardar, si no se indica la escala se tomará escala cero.

Para no indicar la precisión y sí la escala podemos utilizar:

nombre_columna NUMBER (*, escala)

Para introducir números que no estén el  formato estándar de Oracle se puede utilizar la función TO_NUMBER.
FLOAT
Almacena tipos de datos numéricos en punto flotante
Es un tipo NUMBER que sólo almacena números en punto flotante
DATE
Almacena un punto en el tiempo (fecha y hora)
El tipo de datos DATE almacena el año (incluyendo el siglo), el mes, el día, las horas, los minutos y los segundos (después de medianoche).

Oracle utiliza su propio formato interno para almacenar fechas.

Los tipos de datos DATE se almacenan en campos de longitud fija de siete octetos cada uno, correspondiendo al siglo, año, mes, día, hora, minuto, y al segundo.

Para entrada/salida de fechas, Oracle utiliza por defecto el formato
DD-MMM-AA. Para cambiar este formato de fecha por defecto se utiliza el parámetro NLS_DATE_FORMAT.

Para insertar fechas que no estén en el mismo formato de fecha estándar de Oracle, se puede utilizar la función TO_DATE con una máscara del formato: TO_DATE (el “13 de noviembre de 1992”, “DD del MES, YYYY”)
TIMESTAMP
Almacena datos de tipo hora, fraccionando los segundos

TIMESTAMP WITH TIME ZONE
Almacena datos de tipo hora incluyendo la zona horaria (explícita), fraccionando los segundos

TIMESTAMP WITH LOCAL TIME ZONE
Almacena datos de tipo hora incluyendo la zona horaria local (relativa), fraccionando los segundos
Cuando se usa un SELECT para mostrar los datos de este tipo, el valor de la hora será ajustado a la zona horaria de la sesión actual
XMLType
Tipo de datos abstracto. En realidad se trata de un CLOB.
Se asocia a un esquema XML para la definición de su estructura.
Secuencias

Para crear una secuencia en Oracle mediante SQL utilizaremos el comando create sequence con la siguiente sintaxis:
CREATE SEQUENCE nombre_secuencia
INCREMENT BY numero_incremento
START WITH numero_por_el_que_empezara
MAXVALUE valor_maximo | NOMAXVALUE
MINVALUE valor_minimo | NOMINVALUE
CYCLE | NOCYCLE
ORDER | NOORDER
Por ejemplo, si queremos crear una secuencia que empiece en 100 y se incremente de uno en uno utilizaremos la siguiente consulta SQL:
CREATE SEQUENCE incremento_id_cliente
INCREMENT BY 1
START WITH 100
Para utilizar la secuencia, en primer lugar, crearemos una tabla de prueba (para insertar un registro y comprobar que la secuencia anterior funciona correctamente):
create table clientes (
codigo number not null primary key,
nombre varchar2(100) unique not null,
cif varchar2(15) unique,
fechaalta date)
Para utilizar la secuencia creada en una inserción de fila:
insert into clientes values (
incremento_id_cliente.NextVal,
'AjpdSoft',
'11225522F',
sysdate)
Realizamos otra inserción para comprobar que el incremento es de 1:
insert into clientes values (
incremento_id_cliente.NextVal,
'Otro cliente',
'00000G',
sysdate)

Video de Creación de Usuario y Tablas

No hay comentarios:

Publicar un comentario