Prontuario de Oracle: Guía SQL y DDL
Prontuario de Oracle: Guía SQL y DDL
PRONTUARIO DE ORACLE
Contenido
1. Introducción..........................................................................................................................................................3
2. Consolas básicas de trabajo................................................................................................................................3
2.1.1. Comandos SQL*Plus más comunes................................................................................................4
2.1.2. Formato de la salida ...........................................................................................................................5
2.1.3. Formato del resultado de una consulta............................................................................................6
2.1.4. Cálculo de subtotales .........................................................................................................................6
2.1.5. Comandos para manipular el buffer de la consola SQL*Plus ....................................................6
3. Diccionario de datos............................................................................................................................................7
3.1. Tabla user_catalog .............................................................................................................................8
3.2. Tabla user_objects .............................................................................................................................8
3.3. Tabla user_tables................................................................................................................................8
3.4. Tabla user_tab_columns ..................................................................................................................9
3.5. Tabla user_views ..................................................................................................................................9
3.6. Tabla user_constraints ..................................................................................................................9
4. Instrucciones DDL básicas de SQL..................................................................................................................9
4.1. Eliminación de tablas..................................................................................................................................9
4.2. Creación de tablas .....................................................................................................................................10
4.2.1. Restricciones de tabla ......................................................................................................................11
4.3. Modificación de tablas..............................................................................................................................11
4.4. Índices .........................................................................................................................................................11
4.4.1. Creación de índices ..........................................................................................................................11
4.4.2. Eliminación de índices.....................................................................................................................11
5. Instrucciones ADL básicas de SQL................................................................................................................12
5.1. Creación de usuarios.................................................................................................................................12
5.2. Concesión de privilegios..........................................................................................................................12
5.3. Revocación de privilegios........................................................................................................................12
5.4. Creación de roles (papeles):.....................................................................................................................12
6. Notas sobre el DML de SQL............................................................................................................................13
6.1. Reuniones (joins).......................................................................................................................................13
6.1.1. Reuniones internas ...........................................................................................................................13
6.1.2. Reuniones externas...........................................................................................................................13
6.2. La tabla dual ............................................................................................................................................14
6.3. Secuencias...................................................................................................................................................15
7. La consola de administración Enterprise Manager......................................................................................15
7.1. Introducción a la arquitectura ..................................................................................................................15
7.2. La consola de administración ..................................................................................................................15
8. Utilidades.............................................................................................................................................................16
1. Introducción
Oracle es un sistema gestor de bases de datos que implementa el modelo relacional y una versión del
modelo relacional orientado a objetos. Es un sistema multiplataforma (PC, estaciones de trabajo,
mainframes, ...) que admite diferentes modelos de ejecución:
• Cliente/servidor. El servidor realiza gran parte de las tareas de acceso a los datos en respuesta a la
solicitud del cliente, que puede ser una plataforma diferente. En el laboratorio se utilizará este
modelo (un servidor PC y clientes Windows) mediante comunicación soportada con TCP/IP.
• Centralizado o basada en mainframe. El servidor realiza todas las tareas de acceso a los datos e
incluso devuelve los datos con formato para la presentación en informes o formularios. El cliente no
realiza prácticamente ninguna función. Se usa en grandes ordenadores centrales (mainframes) con
terminales soportados directamente por su propio sistema de comunicaciones (por ejemplo, el
protocolo SNA y el método de acceso VTAM en el sistema operativo MVS de IBM).
• Procesamiento distribuido. La base de datos está repartida en diferentes servidores y los usuarios no
son conscientes de la ubicación física de los datos. El servidor distribuido maneja los datos de
manera transparente al usuario.
• Procesamiento paralelo. La base de datos está en una única plataforma con varios procesadores y las
consultas se pueden ejecutar en paralelo.
Las limitaciones de Oracle están determinadas por la plataforma en la que se ejecute más que por el
propio sistema gestor de bases de datos. Así, un servidor UNIX no podrá dar servicio con eficacia a más
de dos o tres mil usuarios. Sin embargo, en grandes sistemas centralizados con capacidad de
teleprocesamiento importante, este número no es una limitación.
Este SGBD está orientado a grandes demandas, por lo que dispone de todas las características que se
requieren de un SGBD para grandes empresas, entre otras:
• Mecanismos de seguridad. Dispone de un lenguaje de control de datos (LCD) que permite definir
derechos de consulta, modificación y creación de datos a los usuarios según el nombre con el que se
inicie la sesión.
• Copias de seguridad y recuperación. Permite realizarlas con el servidor parado o funcionando
(copias en caliente) por lo que es posible un servicio ininterrumpido.
• Conectividad abierta. Permite acceder a datos de otros SGBD.
• Herramientas de desarrollo. Generación de informes, formularios, ...
• Comandos SQL*Plus. Se usan para opciones específicas de las dos consolas interactivas SQL*Plus y
SQL Worksheet.
En la consola SQL*Plus las instrucciones y comandos pueden ocupar más de una línea que se van
numerando. Las líneas terminan con el carácter ";" para indicar su término. Para que se ejecute es
necesario finalizarla con el carácter "/" y pulsar Intro. Si sólo se presiona Intro, la instrucción no se
ejecuta, se queda en el buffer y puede ser ejecutada más tarde.
En la consola SQL Worksheet las instrucciones y comandos se escriben terminadas en punto y coma y se
ejecutan pulsando el símbolo Ejecutar que aparece en la parte superior izquierda o con la tecla F5.
• set: establece valores para las variables de sistema de SQL*Plus. Por ejemplo:
set pause on
Hace que SQL*Plus pare al principio de cada página. Sólo se pasa a la siguiente página cuando el
usuario pulsa RETURN.
set autocommit on
Indica a Oracle que debe comprometer los cambios inmediatamente después de la instrucción SQL
que ha provocado ese cambio.
set echo on
SQL*Plus mostrará cada uno de los comandos de un fichero ejecutado con start.
Se puede obtener ayuda del resto de las variables usando help set.
• spool: almacena los resultados de las consultas en un archivo del sistema operativo.
spool nombre_del_fichero (se añade automáticamente la extensión lst).
Para dejar de enviar al fichero:
spool off
Para mostrar el estado actual (abierto o cerrado) del fichero de salida se usa:
show spool
Para cerrar el fichero e imprimirlo:
spool out
SQL*Plus Worksheet tiene una opción de menú en Archivo que permite almacenar en fichero tanto
la salida como la entrada.
• start: ejecuta comandos almacenados en un archivo (también se puede usar @). Es un comando
muy útil y es preferible escribir comandos en un fichero que directamente en el inductor de SQL.
start nombre_de_archivo
@ nombre_de_archivo
No es necesario especificar la extensión .SQL
directo a los últimos comandos introducidos mediante los botones y (alternativamente con las
teclas CTRL+T y CTRL+N).
En la consola SQL*Plus se almacena en un buffer el último comando introducido en el intérprete. Es
posible acceder, cambiar, guardar y guardar el contenido del buffer utilizando los siguientes comandos.
Todos los comandos (menos list) se refieren a la línea actual que puede cambiarse usando list
número_de_línea.
• append (Abreviado a) T EXT : añade el texto al final de una línea.
• list n, lista una línea y hace que sea la línea actual. También se puede usar l n o simplemente n,
siendo n el número de línea.
• list *, lista la línea actual.
• list last, lista la última línea del buffer.
3. Diccionario de datos
Toda la información de las tablas está registrada en el diccionario del sistema (Data Dictionary), que está
formado por tablas especiales que se crean en la instalación de Oracle (que son administradas por el
sistema).
Las tablas que constituyen el diccionario de datos están accesibles a través de la vista (del sistema)
dictionary o su sinónimo dict.
El diccionario de datos lo actualiza Oracle y puede ser consultado (total o parcialmente según los
permisos) por los usuarios. Las consultas se hacen usando las vistas del diccionario de datos, que son de
tres tipos:
• Las vistas cuyo nombre comienza por all_ , pueden ser consultadas por todos los usuarios y
ofrecen información sobre todos los objetos del sistema.
Ejemplo: all_tables, all_sequences, all_views, ...
• Las vistas cuyo nombre comienza por USER_ , ofrecen información para listar los objetos propios.
Ejemplo: user_tables, user_sequences, ..
• Las vistas cuyo nombre comienza por dba_ , sólo son accesibles para tareas de administración.
Para consultar la lista de tablas que componen el diccionario se escribe:
help data dict
Que muestra una lista con la siguiente información:
Nombre de la tabla Descripción
También se puede ver la estructura de una tabla del diccionario como se muestra a continuación:
describe all_tables;
describe all_indexes;
describe all_sequences;
Listar las tablas, índices y secuencias definidas por el usuario EIDOS.
Para las tablas:
select table_name "tabla"
from all_tables
where owner='inf01';
Para los índices:
select table_name, index_name
from all_indexes
where owner='inf01';
Para las secuencias:
select sequence_name
from all_sequences
where sequence_owner='inf01';
13 filas seleccionadas.
Donde el tipo de restricción es:
• C para indicar NOT NULL
• P para indicar PRIMARY KEY
• R para indicar REFERENCES
Los nombres de las restricciones son los proporcionados por el usuario o por el sistema cuando aquél no
dio ninguno.
Como máximo pueden tener 254 columnas. El nombre de la tabla puede tener de 1 a 30 caracteres. Deben
empezar con un carácter entre A y Z. Dependiendo del sistema, se hace distinción entre mayúsculas y
minúsculas. También es posible, dependiendo del sistema, incluir caracteres del conjunto extendido
ASCII (eñes, acentos) y espacios (para los espacios es preciso encerrar el nombre entre comillas dobles).
No se pueden crear tablas con el mismo nombre dentro de la misma base de datos. La tabla tiene como
propietario al usuario que las crea. Otro usuario que desee usar nuestras tablas debe tener autorización
para ello (véase el apartado 5) y hacer referencia a la tabla como (propietario.tabla).
definición_de_columna: <nombre_de_columna> <tipo_datos> [(<tamaño>)] [default <expr>]
[<restricción_de_columna>]
Donde:
• <nombre_de_columna>: Nombre de la columna. Cada columna o campo puede tener un nombre de 1
a 30 caracteres. Se permite el mismo nombre de campo en tablas distintas de una misma base de
datos, pero no en la misma tabla.
• <tipo_datos> y <tamaño>: Tipo de datos de la columna. Algunos tipos de datos habituales son:
char(N): cadena de longitud fija de N caracteres
numeric(P[,D]): número decimal con P dígitos de los cuales D son los decimales. Es el único tipo
de datos numérico de Oracle, pero también acepta los nombres de los tipos de datos de otros
sistemas, como por ejemplo:
integer: número entero, que se representa en Oracle como number(38).
• default Valor predeterminado: se usa para fijar un valor predeterminado cuando se inserta una fila
sin especificar ningún valor en esta columna. Ejemplo: beneficios integer default = 10000
• Clave primaria: columna que identifica de forma única al registro, es un valor único y no nulo
(not null). Por ejemplo: el código del cliente es una clave primaria que identifica de forma
única e irrepetible a cada cliente.
• Clave candidata: unique fuerza a que no pueda haber dos filas con el mismo valor en esta
columna.
• Clave externa: Columna de la tabla que hace referencia a un valor que tiene que estar registrado
en otra tabla.
La cláusula on delete cascade es opcional. Si se especifica, Oracle borrará
automáticamente todas las filas dependientes cuando se borra la fila referenciada (la que
contiene la clave primaria o candidata).
4.4. Índices
La reunión externa por la izquierda a =? θ b, que incluye en el resultado todas las filas de a aunque
no encuentren correspondencia con ninguna fila de b, se expresa:
select a.*,b.* from a,b where a.columna_1 = a.columna_1 (+) and ...
and a.columna_n = b.columna_n (+)
Con la sintaxis ANSI disponible en Oracle 9i:
select a.*,b.* from a left outer join b on a.columna_1 =
b.columna_1 and ... and a.columna_n = b.columna_n
que, si se trata de una equirreunión, se puede simplificar a:
select a.*,b.* from a left outer join b using (columna_1, ...,
columna_n)
Si se trata de una reunión natural, se puede simplificar a:
select a.*,b.* from a natural left outer join b
• Reunión externa por la derecha.
La reunión externa por la derecha a ? =θ b, que incluye en el resultado todas las filas de a aunque no
encuentren correspondencia con ninguna fila de b, se expresa:
select a.*,b.* from a,b where a.columna_1 (+) = a.columna_1 and ...
and a.columna_n (+) = b.columna_n
Con la sintaxis ANSI disponible en Oracle 9i:
select a.*,b.* from a right outer join b on a.columna_1 =
b.columna_1 and ... and a.columna_n = b.columna_n
La reunión externa completa a =? =θ b, que incluye en el resultado todas las filas de a y b aunque
no encuentren correspondencia con ninguna fila de b o de a, respectivamente, no se puede expresar
con una única instrucción select. Se puede expresar:
select a.*,b.* from a,b where a.columna_1 (+) = a.columna_1 (+) and
... and a.columna_n (+) = b.columna_n (+)
Con la sintaxis ANSI disponible en Oracle 9i:
select a.*,b.* from a full outer join b on a.columna_1 =
b.columna_1 and ... and a.columna_n = b.columna_n
que, si se trata de una equirreunión, se puede simplificar a:
select a.*,b.* from a right outer join b using (columna_1, ...,
columna_n)
Si se trata de una reunión natural, se puede simplificar a:
select a.*,b.* from a natural full outer join b
Restricciones sobre las reuniones externas según la sintaxis de Oracle 8.
• El operador (+) sólo puede aparecer en la cláusula WHERE, no en la lista de proyección, y sólo se
puede aplicar a una columna de una tabla o vista.
• Si A y B se reúnen con varias condiciones de reunión, el operador (+) se debe usar en todas estas
condiciones.
• El operador (+) se puede aplicar sólo a una columna, no a una expresión arbitraria. Sin embargo, una
expresión arbitraria puede contener una columna marcada con el operador (+).
• Una condición que contenga el operador (+) no se puede combinar con otra condición usando el
operador lógico OR.
• Una condición no puede usar el operador IN para comparar con otra expresión con una columna
marcada con (+).
• Una condición no puede comparar con una subconsulta con cualquier columna marcada con (+).
• En una consulta de reunión sobre más de dos tablas no se puede expresar más de una tabla que aporte
nulos que se reúna con otra dada.
6.3. Secuencias
Las secuencias son series de números que el sistema genera automáticamente. Estos números se usan
como valores para las claves primarias, de forma que cada fila de una tabla se pueda identificar
unívocamente, incluso en un entorno multiusuario en el que varios usuarios puedan estar generando
valores de una misma secuencia, como en el caso de la adición concurrente de filas a una misma tabla.
Su sintaxis es:
create sequence nombre_secuencia
[increment by número_entero]
[start with número_entero]
[maxvalue número_entero |nomaxvalue]
[minvalue número_entero |nominvalue]
[cycle|nocycle]
Para acceder a las secuencias se usan las funciones nextval y currval. La función nextval realiza
una petición al sistema para que genere el siguiente valor de la secuencia. En el ejemplo,
nombre_secuencia.nextval, nos dará el siguiente valor que le corresponde a la secuencia. Para conocer
el valor actual de la secuencia, o sea, el último código asignado, se usa la columna
nombre_secuencia.currval, desde la tabla dual del sistema. Antes de poder usar currval hay que
usar nextval para iniciar la secuencia.
Con esta herramienta se pueden crear, borrar y modificar los mismos objetos y s us parámetros que con los
lenguajes DDL y ACL. Las acciones de administración puntuales, como alterar una tabla, conceder
permisos, se realizan de forma muy cómoda con esta herramienta.
8. Utilidades
En este apartado se describen brevemente algunas de las utilidades más prácticas y usadas de Oracle. Para
obtener más ayuda sobre ellas hay que consultar el libro Utilities de la documentación de Oracle.
8.1. SQL*Loader
SQL*Loader es un programa que permite la carga de datos en tablas de Oracle a partir de ficheros de
texto. Es útil cuando se importan datos de fuentes que no son una base de datos Oracle. Es una situación
común cuando se migran datos de unos sistemas a otros y es necesario vigilar la correcta conversión de
los datos entre los dos sistemas. Cuando los datos no cumplen las restricciones de integridad impuestas
sobre las tablas de la base de datos Oracle, SQL*Loader informa de ello tanto en pantalla como en un
fichero de registro (log) que genera. También puede generar un fichero con todos los registros que no se
han cargado satisfactoriamente.
Este programa se llama con el comando sqlldr desde una interfaz de comandos del sistema operativo, no
desde la consola SQL*Plus o SQL Worksheet.
Este comando admite una serie de parámetros que guían su funcionamiento; en este apartado se
repasarán más adelante los más comunes.
La forma más común de ejecutar SQL*Loader es:
sqlldr userid=usuario@servicio/contraseña
control=archivo_de_control log=archivo_de_informe.
Donde usuario es el nombre de usuario definido en la base de datos bajo el cual se van a cargar los
datos, servicio es el nombre del servicio (gestor de bases de datos) mediante el que se va a realizar la
conexión, contraseña es la palabra clave del usuario de la base de datos, archivo_de_control
es el nombre del archivo de control en donde se definen parámetros de funcionamiento y
archivo_de_informe es el nombre del archivo que genera el programa para indicar el resultado de
la operación. Los nombres de archivo pueden incorporar la ruta completa o usar nombres de archivo con
rutas relativas. Lo más habitual es llamar al programa desde el directorio en el que se tengan los archivos
de control y datos y especificar sólo los nombres de estos archivos.
El archivo de control puede tener la siguiente estructura:
LOAD DATA
[INFILE *|Fichero El fichero de entrada puede ser el nombre del fichero o bien
[BADFILE Fichero] * que significa que los datos se incorporan al propio fichero
[DISCARDFILE Fichero] de control.
…] Si el fichero de entrada es de formato
INTO TABLE NombreTabla variable se le indica el separador de campo.
[REPLACE|APPEND|]
[FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"']
( CAMPO1 [POSITION(CarIni:CarFin)]
[, CAMPO2 [POSITION(CarIni:CarFin)] Si el fichero de entrada es de formato
) fijo se le indica en cada campo las
[BEGINDATA posiciones que ocupa.
LíneaDatos1
LíneaDatos1
.
. Opcionalmente se pueden añadir los datos directamente
. en el fichero de control.
LíneaDatosn
]
Las opciones más importantes son:
LOAD DATA
INFILE NombreFichero
INTO TABLE NombreTabla
APPEND
FIELDS TERMINATED BY ','
(Campo1, ..., CampoN)
Que hace referencia al fichero NombreFichero que contiene los datos de entrada estructurados como
se indica a continuación:
valor11,...,valor1N,
valor21,...,valor2N,
...
valorM1,...,valorMN
Existen muchas más opciones como, por ejemplo, cargar en varias tablas en función del valor de un
campo. Dos utilidades más son la forma de cargar fechas y aplicar funciones a los datos de entrada.
LOAD DATA
INFILE *
INTO TABLE Pacientes
REPLACE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
( NOMBRE "upper(:nombre)",
APELLIDOS "upper(:apellidos)",
FEC_NACIMIENTO DATE 'DD/MM/YYYY HH24:MI:SS',
)
BEGINDATA
Pedro, Fernández Martín, 23/04/1956 13:24:23
Para cargar fechas se indica que el campo es de fecha poniendo después del nombre del campo la palabra
DATE, un espacio y, entre comillas simples, el formato (por ejemplo: YYYYMMDD y DD-MM-
YYYY).
Para aplicar una función SQL tenemos que tener en cuenta que cada campo posee una variable asociada
que se llama :nombre_campo. Después del nombre del campo y entre comillas dobles se escriben las
funciones a aplicar.
8.2. Import/Export
Las utilidades Import/Export son unas de las más antiguas de Oracle. Son herramientas basadas en línea
de comandos que permiten extraer y cargar tablas, esquemas, objetos o la base de datos completa. A
diferencia de SQL*Loader, la transferencia de datos se realiza entre instancias de Oracle. Son
herramientas realmente útiles y de uso bastante sencillo. La exportación de los datos se realiza con el
comando exp y la importación con imp.
8.2.1. Export
Su sintaxis es:
exp parámetro=valor ó parámetro=(valor1,valor2, ...valorn)
Algunos de sus parámetros son:
BUFFER Depende Tamaño del buffer para el array de comunicación con el servidor.
Tamaños grandes de array mejoran la eficiencia.
del SO
COMPRESS Y Este parámetro es engañoso, no comprime los datos, sino que
PARFILE N/A Nombre del fichero de parámetros (en vez de introducir éstos vía
comando)
QUERY N/A Permite definir una cláusula WHERE, que se aplicará a todas las
tablas, y sólo las filas que la cumplan se exportarán.
ROWS Y Si hay que exportar los datos o bien sólo se desea la estructura
8.2.2. Import
Su sintaxis es:
imp parámetro=valor ó parámetro=(valor1,valor2, ...valorn)
Algunos de sus parámetros son:
SHOW N Muestra las acciones que haría para importar, pero no almacena
ninguno .
TABLES N/A Lista de tablas a importar encerradas entre paréntesis y separadas
por comas.
TOUSER N/A Usuario donde se importan los datos.