introducción a sistemas oracle

71
Introdución al SQL Este curso pretende ser una introducción al SQL, y en particular a la versión que utiliza el SGBD Oracle (7.3) llamado SQL*Plus. No se pretende realizar un estudio exhaustivo de todas las opciones, comandos y aspectos de almacenamiento y administración que se pueden considerar en SQL. Sólo se ha pretendido introducir y explicar los comandos más utilizados con sus opciones más útiles, dejando los detalles más específicos a los manuales de referencia. Las razones que me han movido a construirlo en HTML y facilitar su acceso mediante Web son las posibilidades de interacción con el texto y de mayor difusión. Por ahora las tablas de ejemplo son estáticas y se encuentran en el texto mismo, pero mi intención es que se pueda interactuar con una base de datos en tiempo real. ¿Quizás más adelante?. Si tienes cualquier sugerencia o encuentras una errata escondida dímelo. Abril de 1998. Jesús Vegas Dpto. Informática Universidad de Valladolid [email protected] Índice 1. Terminología 2. Tipos de sentencias SQL 3. SQL*Plus o Conexión o Posibilidades de Edición

Upload: theencontrador

Post on 11-Jun-2015

2.008 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Introducción a sistemas ORACLE

Introdución al SQL

Este curso pretende ser una introducción al SQL, y en particular a la versión que utiliza el SGBD Oracle (7.3) llamado SQL*Plus. No se pretende realizar un estudio exhaustivo de todas las opciones, comandos y aspectos de almacenamiento y administración que se pueden considerar en SQL. Sólo se ha pretendido introducir y explicar los comandos más utilizados con sus opciones más útiles, dejando los detalles más específicos a los manuales de referencia.

Las razones que me han movido a construirlo en HTML y facilitar su acceso mediante Web son las posibilidades de interacción con el texto y de mayor difusión. Por ahora las tablas de ejemplo son estáticas y se encuentran en el texto mismo, pero mi intención es que se pueda interactuar con una base de datos en tiempo real. ¿Quizás más adelante?.

Si tienes cualquier sugerencia o encuentras una errata escondida dímelo.

Abril de 1998.

Jesús Vegas Dpto. Informática

Universidad de Valladolid [email protected]

Índice

1. Terminología 2. Tipos de sentencias SQL 3. SQL*Plus

o Conexión o Posibilidades de Edición o Utilización de Ficheros

4. Creación o Tipos de Columnas o Restricciones o Comando DESCRIBE

5. Modificación 6. Inserción, Actualización y Borrado

o Inserción o Actualización o Borrado

7. Selección o Selección de Columnas o Cláusula FROM

Page 2: Introducción a sistemas ORACLE

o Cláusula WHERE o Cláusula ORDER BY o Cláusula DISTINCT o Funciones o Cláusula GROUP BY o Expresiones con Sentencias SELECT o Combinaciones o Subconsultas

8. Eliminación 9. Vistas 10. Jugando con los Nombres

o Sinónimos o El Comando RENAME

11. Lo Mas SQL*Plus o Ficheros de Comandos o Generación de Informes

1 Terminología

SQL Structured Query Language o Lenguaje de Consultas Estructurado. Es el lenguaje que permite la comunicación con el Sistema Gestor de Bases de Datos (Oracle en nuestro caso).

El SQL es un lenguaje unificado Lo utilizan todo tipo de usuarios, desde el administrador de la base de datos, DBA, hasta el usuario final.

El SQL es un lenguaje no procedimental. El usuario especifica Qué quiere, no Cómo ni Dónde conseguirlo.

El SQL es relacionalmente completo. Permite la realización de cualquier consulta de datos.

SQL= DDL + DML Las sentencias del SQL se clasifican como parte del DDL o del DML.

Lenguaje de Definición de Datos, DDL sentencias del SQL que permiten definir los objetos de la Base de Datos (create, revoke, grant, alter, etc.). Cuando se definen dichos objetos se almacenan en el diccionario de datos.

Lenguaje de Manipulación de Datos, DML sentencias del SQL que se utilizan para manejar los datos de la base de datos (select, insert, update, delete, etc).

commit/rollback cada vez que se realiza alguna operación en la base de datos se realiza no sobre la tabla en sí, sino sobre una copia local de la misma. Así, si queremos que los resultados de la modificación se trasladen a la base de datos y perduren en el tiempo hay que confirmar dicha operación con el comando commit. También se puede impedir que los últimos cambios lleguen a efectuarse con rollback,

Page 3: Introducción a sistemas ORACLE

aunque existen algunas sentencias SQL que se 'autoconfirman' y no se pueden volver atrás.

Diccionario de la Base de Datos Guarda la definición de todos los objetos almacenados en la base de datos; sus características, restricciones, privilegios, relaciones entre ellos, etc.

2 Tipos de Sentencias

Las sentencias SQL pertenecen a dos categorías principales: Lenguaje de Definición de Datos, DDL y Lenguaje de Manipulación de Datos, DML. Estos dos lenguajes no son lenguajes en sí mismos, sino que es una forma de clasificar las sentencias de lenguaje SQL en función de su cometido. La diferencia principal reside en que el DDL crea objetos en la base de datos y sus efectos se pueden ver en el diccionario de la base de datos; mientras que el DML es el que permite consultar, insertar, modificar y eliminar la información almacenada en los objetos de la base de datos.

Cuando se ejecutan las sentencias DDL de SQL, el SGBD confirma la transacción actual antes y después de cada una de las sentencias DDL. En cambio, las sentencias DML no llevan implícito el commit y se pueden deshacer. Existe pues un problema al mezclar sentencias DML con DDL, ya que estas últimas pueden confirmar las primeras de manera involuntaria e implicita, lo que en ocasiones puede ser un problema.

A continuación se presenta una tabla con las sentencias SQL más comunes, clasificadas según el lenguaje al que pertenecen.

Sentencia DDL

Objetivo

Alter procedure

Recompilar un procedimiento almacenado.

Alter Table Añadir o redefinir una columna, modificar la asignación de almacenamiento.

Analyze Recoger estadísticas de rendimiento sobre los objetos de la BD para utilizarlas en el optimizador basado en costes.

Create Table Crear una tabla.

Create Index Crear un índice.

Drop Table Eliminar una tabla.

Drop Index Eliminar un índice.

Grant Conceder privilegios o papeles, roles, a un usuario o a otro rol.

Truncate Eliminar todas las filas de una tabla.

Revoke Retirar los privilegios de un usuario o rol de la base de datos.

Sentencia DML

Objetivo

Page 4: Introducción a sistemas ORACLE

Insert Añadir filas de datos a una tabla.

Delete Eliminar filas de datos de una tabla.

Update Modificar los datos de una tabla.

Select Recuperar datos de una tabla.

Commit Confirmar como permamentes las modificaciones realizadas.

Rollback Deshacer todas las modificaciones realizadas desde la última confirmación.

3 SQL*Plus

La herramienta que nos proporciona ORACLE para interactuar con la base de datos se llama SQL*Plus. Básicamente, es un intérprete SQL con algunas opciones de edición y formateo de resultados.

Antes de ver la manera de conectarse a SQL*Plus, conviene tener claros algunos conceptos:

Usuario/Clave Para poder acceder a una base de datos gestionada por ORACLE debemos ser un usuario autorizado de la misma y conocer la palabra clave, password, asociada al usuario.

Variable de ambiente ORACLE_SID Indica la base de datos con la que vamos a trabajar.

3.1 Conexión

Para entar en SQL*Plus se debe ejecutar el comando

$ sqlplus usuario/passwddonde le indicamos al SGBD Oracle quién somos y nuestra palabra clave.

Si la configuración del SGBD Oracle se corresponde a una configuración cliente-servidor asentada sobre una red (SQL*Net v2) deberemos indicar, además, el sevicio (o base de datos) con el que queremos contactar. Esto se hace colocando el símbolo @ antes del nombre del servicio como se indica a continuación:

$ sqlplus usuario/passwd@servicioOtra circunstancia que hay que tener en cuenta a la hora de conectarnos a SQL*Plus es el modo establecido por el DBA para la autentificación del usuario de la base de datos.

Page 5: Introducción a sistemas ORACLE

La primera posibilidad es que recaiga sobre el SGBD Oracle la autentificación de los usuarios, por lo que tendremos que darle nuestro nombre de usuario y la palabra de paso. Pero existe la posibilidad de que el SGBD Oracle deje en manos del Sistema Operativo esta responsabilidad. Así, no será necesario demostrarle al SGBD Oracle quién somos ya que el SO se ha encargado previamente de comprobar que todo es correcto. En este segundo caso, el comando de conexión con SQL*Plus debe omitir el nombre de usuario y la palabra clave, pero manteniendo el resto de esta manera:

$ sqlplus /@servicioUna vez que hemos conseguido entrar en SQL*Plus nos presenta el prompt y espera la insercción de sentencias SQL. Todas las sentencias deben acabar con un ';'. Una sentencia puede continuar en varias líneas, que SQL*Plus va numerando. Si queremos anular la sentencia actual podemos hacerlo colocando un '.' como único carácter en una línea. Si queremos volver a ejecutar la última sentencia se puede hacer con el comando '/'. Si queremos ejecutar las sentencias que almacena un fichero .sql podemos hacerlo anteponiendo el símbolo '@' al nombre del fichero.

Para cerrar la sesión vale con teclear 'exit'.

3.2 Posibilidades de Edición

SQL*Plus almacena en un buffer la última sentencia SQL introducida. El buffer mantiene sólo una sentencia cada vez, y si se introduce una nueva sentencia se sobreescribe sobre la anterior.

La sentencia en el buffer puede ser recuperada para ejecutarla de nuevo con los comandos:

RUN que visualiza la sentencia en el buffer antes de ejecutarla; / que ejecuta la sentencia sin visualizarla.

SQL*Plus también nos permite editar la sentencia SQL alamacenada en el buffer mediante un sencillo (y limitado) editor en línea, cuyos comandos se enumeran a continuación:

Comando Abreviatura Descripción

APPEND texto A texto Añade texto al final de la línea.

CHANGE/fuente/destino C/fuente/destino Cambia el contenido 'fuente' por el 'destino'

CHANGE/texto C/texto Quita 'texto' de una línea.

CLEAR BUFFER CL BUFF Borra el buffer

DEL DEL Borra una línea.

INPUT I Inserta una o más líneas.

INPUT texto I texto Inserta una línea con 'texto'.

LIST L Lista las líneas del buffer

Page 6: Introducción a sistemas ORACLE

LIST n L n ó n Lista la línea n-ésima.

LIST * L * Lista la línea actual.

LIST LAST L LAST Lista la última línea.

LIST m n L m n Lista las líneas desde la m-ésima a la n-ésima.

Al contenido del buffer también se puede acceder desde el editor del Sistema Operativo. Así, el buffer podrá ser manipulado con las posibilidades del editor con el que estemos acostumbrados a trabajar. Al salir del editor se devuelve el control al SQL*Plus. Para conseguir trabajar con el editor del Sistema Operativo basta con colocar la variable DEFINE_EDITOR y luego llamar al editor.

SQL> define_editor=viSQL> edit

3.3 Utilización de Ficheros

SQL*Plus considera dos tipos de ficheros: de spool y de comandos.

Un fichero de spool almacena los resultados de una consulta (o varias) en un fichero con la extensión .lst (o lo manda a la impresora).

Los comandos asociados con los ficheros spool son

SPOOL fichero

Manda el resultado de las consultas al fichero. SPOOL OUT

Manda el resultado de las consultas a la impresora. SPOOL OFF

Cierra el fichero de spool. EXIT

Al salir de SQL*Plus se cierran los ficheros de spool.

Los archivos de comandos almacenan comandos SQL y SQL*Plus para ser editado, almacenado y/o ejecutado; y tienen por defecto la extensión .sql :

Para editarlo se puede utilizar el comando edit fichero. Para ejecutarlo se utilizará el comando START fichero o @fichero

El SQL*Plus nos proporciona más posibilidades en relación con los ficheros de comandos, la comunicación con el usuario final y la generación de informes. Pero antes de ver este tipo de cosas, es mejor que sigamos profundizando en el conocimiento del lenguaje SQL. Al final del curso se puede se encuentra un capítulo con algunas de las cosillas que quedan por contar del SQL*Plus.

Page 7: Introducción a sistemas ORACLE

4 Creación

La primera fase de cualquier base de datos comienza siempre con sentencias DDL, ya que antes de poder almacenar información debemos definir los objetos básicos donde agrupar la información. Los objetos básicos con que trabaja SQL son las tablas. Una tabla es un conjunto de celdas agrupadas en filas y columnas donde se almacenan elementos de información.

Antes de llevar a cabo la creación de una tabla conviene planificar:

nombre de la tabla, nombre de cada columna, tipo y tamaño de los datos almacenados en cada columna, información adicional, restricciones, etc.

Hay que tener en cuenta también ciertas restricciones en la formación de los nombres de las tablas: longitud máxima de 30 caracteres, no puede haber nombres de tabla duplicados, deben comenzar con un carácter alfabético, permitir caracteres alfanuméricos y el guión bajo '_', y Oracle no distingue entre mayúsculas y minúsculas.

La sintaxis del comando que permite crear un tabla es la siguiente:

CREATE TABLE [esquema.]tabla ({columna tipoColumna [NOT NULL],}+, {CONSTRAINT nombreRestricción {UNIQUE ([column,]+)| DEFAULT expresion| CHECK (condicion)| PRIMARY KEY ([column,]+)| FOREIGN KEY (column) REFERENCES tabla(columna)},}*)

Del examen de la sintaxis de la sentencia Create Table se pueden concluir que necesitamos conocer los distintos tipos de columna y las distintas restricciones que se pueden imponer al contenido de las columnas. Vayamos por partes.

4.1 Tipos de Columnas

Existen varios tipos de datos en SQL. De esta manera, cada columna puede albergar una información de naturaleza distinta. Los tipos de datos más comunes y sus características se resumen en la siguiente tabla.

Tipo de Dato Descripción VARCHAR2(tamaño) Almacena datos de tipo carácter alfanumérico de longitud

Page 8: Introducción a sistemas ORACLE

variable, con un tamaño máximo de 2.000.

CHAR(tamaño) Almacena datos de tipo carácter alfanumérico de longitud fija, con un tamaño máximo de 255.

LONG Almacena datos de tipo carácter alfanumérico de longitud variable con un tamaño máximo de hasta 2 Gb.

NUMBER(dig,dec) Almacena datos numéricos de dig dígitos, de los cuales dec son decimales. El tamaño máximo es de 38 dígitos.

DATE Almacena fechas desde el 1-Ene-4712 AC hasta el 31-Dic-4712 DC.

RAW(tamaño) Almacena datos de longitud variable, con un tamaño máximo de 255 bytes.

LONG RAW Almacena datos de longitud variable, con un tamaño máximo de 2 Gb.

4.2 Restricciones

Las restricciones de los datos se imponen para asegurarnos que los datos cumplen con una serie de condiciones predefinidas para cada tabla. Estas restricciones ayudan a conseguir la integridad de referencia: todas las referencias dentro de una BD son válidas y todas las restricciones se han cumplido.

Las restricciones se van a definir acompañadas por un nombre, lo que permitirá activarlas o desactivarlas según sea el caso; o también mezcladas en la definiciones de las columnas de la tabla. A continuación vamos a describir cada una de las restricciones mencionadas.

NOT NULL Establece la obligatoriedad de que esta columna tenga un valor no nulo. Se debe especificar junto a la columna a la que afecta. Los valores nulos no ocupan espacio, y son distintos a 0 y al espacio en blanco. Hay que tener cuidado con los valores nulos en las operaciones, ya que 1 * NULL es igual a NULL.

UNIQUE Evita valores repetidos en una columna, admitiendo valores nulos. Oracle crea un índice automáticamente cuando se habilita esta restricción y lo borra al deshabilitarse.

DEFAULT Establece un valor por defecto para esa columna, si no se le asigna ninguno.

CHECK Comprueba que se cumpla una condición determinada al rellenar esa columna. Esta condición sólo debe estar construida con columnas de esta misma tabla.

PRIMARY KEY Establece el conjunto de columnas que forman la clave primaria de esa tabla. Se comporta como única y obligatoria sin necesidad de explicitarlo. Sólo puede existir una clave primaria por tabla. Puede ser referenciada como clave ajena por otras tablas. Crea un índice automáticamente cuando se habilita o se crea esta restricción. En Oracle, los índices son construidos sobre árboles B+.

FOREIGN KEY

Page 9: Introducción a sistemas ORACLE

Establece que el contenido de esta columna será uno de los valores contenidos en una columna de otra tabla maestra. Esta columna marcada como clave ajena puede ser NULL. No hay límite en el número de claves ajenas. La clave ajena puede ser otra columna de la misma tabla. Se puede forzar que cuando una fila de la tabla maestra sea borrada, todas las filas de la tabla detalle cuya clave ajena coincida con la clave borrada se borren también. Esto se consigue añadiendo la coletilla ON DELETE CASCADE en la definición de la clave ajena.

Seguidamente se presenta un ejemplo en el que se crean dos tablas, una de departamentos y otra de empleados:

REMREM tabla departamento con un código de departamento, un nombre y unaREM localización.REMcreate table dep ( cod_dep number(3), nombre varchar2(15) not null, loc varchar2(10), constraint dep_pk primary key (cod_dep), constraint dep_loc check (loc in ('Valladolid', 'Boecillo', 'Cigales')));

REMREM tabla empleado con un código de empleado, un nombre, un oficio, unREM jefe, una fecha de alta en la empresa, un salario mensual, unaREM comisión y el código del departamento donde trabaja.REMcreate table emp ( cod_emp number(3), nombre varchar2(10) not null, oficio varchar2(11), jefe number(3), fecha_alta date, salario number(10), comision number(10), cod_dep number(3), constraint emp_pk primary key (cod_emp),

Page 10: Introducción a sistemas ORACLE

constraint emp_fk foreign key (cod_dep) references dep(cod_dep) on delete cascade, constraint emp_ck check (salario > 0));

4.3 Comando Describe

Oracle nos proporciona un comando que resulta muy útil cuando queremos conocer la estructura de una tabla, las columnas que la forman y su tipo y restricciones. Este comando toma una mayor importancia según nos alejemos del momento de creación de una tabla.

La sintásis es la siguiente

DESCRIBE tabla

Y un ejemplo de su utilización se puede ver al describir la definición de las dos tablas creadas antes. Como no es una sentencia SQL no necesita el ';' al final. También se puede abreviar como DESC.

SQL> describe dep Name Null? Type ------------------------------- -------- ---- COD_DEP NOT NULL NUMBER(3) NOMBRE NOT NULL VARCHAR2(15) LOC VARCHAR2(10)

SQL> desc emp Name Null? Type ------------------------------- -------- ---- COD_EMP NOT NULL NUMBER(4) NOMBRE NOT NULL VARCHAR2(10) OFICIO VARCHAR2(10) JEFE NUMBER(4) FECHA_ALTA DATE SALARIO NUMBER(10) COMISION NUMBER(10) COD_DEP NUMBER(3)

Page 11: Introducción a sistemas ORACLE

5 Modificación

Después de crear una tabla, a veces nos encontramos con que se necesita añadir una columna adicional o modificar la definición de una columna existente. Esta operación se puede realizar con el comando ALTER TABLE.

ALTER TABLE tabla {ADD | MODIFY} ({columna tipoColumna [NOT NULL],}+);

Hay que tener en cuenta varios puntos:

No es posible disminuir el tamaño de un columna. En las modificaciones, los tipos anterior y nuevo deben ser compatibles, o la

tabla debe estar vacía. La opción ADD ... NOT NULL sólo será posible si la tabla está vacía. La opción MODIFY ... NOT NULL sólo podrá realizarse cuando la tabla no

contenga ninguna fila con valor nulo en la columna en cuestión.

Por ejemplo la sentencia siguiente añade la fecha de nacimiento a la tabla de empleados.

SQL> alter table emp add (fecha_nac date not null);

También se puede querer modificar una tabla añadiendo o eliminando restricciones. En este caso el comando a utilizar será

ALTER TABLE tabla {ADD | DROP} CONSTRAINT restricción;

6 Inserción, Actualización y Borrado

Una vez que tenemos definida la estructura de una tabla se pueden insertan los datos, modificarlos o borrarlos de la tabla.

Esta tarea entra dentro de las operaciones que se realizan con el lenguaje DML. Este lenguaje permite manipular los objetos de la base de datos, insertando, modificando y/o borrando el contenido de las tablas. Hay que recordar que estas sentencias no son 'autoconfirmadas' y requieren de la sentencia COMMIT para que sus efectos perduren en el tiempo, o de la sentencia ROLLBACK para deshacer los cambios efectuados.

A continuación vamos a estudiar tres de las sentencias DML más comunes.

Page 12: Introducción a sistemas ORACLE

6.1 Inserción

El comando que permite insertar filas en las tablas es el siguiente.

INSERT INTO tabla [({columna,}*)] VALUES ({expresión,}+);

Sólo especificaremos las columnas donde insertar y su orden cuando no insertemos datos en todas ellas o no lo hagamos en el mismo orden en que definimos la tabla. La asociación columna-valor es posicional. Los valores deben cumplir con los tipos de datos definidos. Los valores de tipo caracter y fecha deben ir encerrados entre comillas simples, ('').

A continuación se puede ver la inserción de filas en las tablas de ejemplo.

REM insertar filas en la tabla depinsert into dep values (100,'Administracion','Valladolid');insert into dep values (200,'I+D','Boecillo');insert into dep values (300,'Produccion','Cigales');

REM insertar filas en la tabla empinsert into emp values (101,'Cano','Presidente',null,'3-FEB-96',450000,null,100);insert into emp values (102,'Roncal','Director',101,'3-FEB-96',350000,null,100);insert into emp values (103,'Rueda','Secretario',102,'17-MAR-96',175000,null,100);insert into emp values (104,'Martin','Contable',102,'17-MAR-96',235000,null,100);insert into emp values (105,'Sanz','Comercial',101,'17-MAR-96',150000,10,100);insert into emp values (106,'Lopez','Comercial',101,'21-MAR-96',150000,15,100);insert into emp values (201,'Perez','Director',101,'4-JUN-96',350000,null,200);insert into emp values

Page 13: Introducción a sistemas ORACLE

(202,'Sastre','Analista',201,'8-JUN-96',300000,null,200);insert into emp values (203,'Garcia','Programador',202,'8-JUN-96',225000,null,200);insert into emp values (204,'Mateo','Programador',202,'8-JUN-96',200000,null,200);insert into emp values (301,'Yuste','Director',101,'3-OCT-96',350000,null,300);insert into emp values (302,'Recio','Analista',301,'4-FEB-97',300000,null,300);insert into emp values (303,'Garcia','Programador',302,'4-FEB-97',210000,null,300);insert into emp values (304,'Santana','Programador',302,'4-FEB-97',200000,null,300);

6.2 Actualización

Otra de las operaciones más comunes es la modificación de la información almacenada en las tablas. Para ello se utiliza el comando UPDATE cuya sintaxis se muestra a continuación.

UPDATE tabla SET {columna = expresión,}+ [WHERE condición];

Se especificará en la cláusula SET las columnas que se actualizarán y con qué valores. La cláusula WHERE indica las filas con las que se va a trabajar. Si se omite la actualización afectará a todas las filas de la tabla.

6.3 Borrado

Con insertar y modificar, la otra operación que completa el trio es la de borrado de filas. La sintaxis es la que sigue:

DELETE FROM tabla [WHERE condición];

Borrará todas las filas que cumplan la condición especificada en la cláusula WHERE. Si esta cláusula no se fija, se borrarán todas las filas de la tabla. Aquí cabe decir que

Page 14: Introducción a sistemas ORACLE

aunque con DELETE borremos todas las filas de una tabla, no borramos la definición de la tabla del diccionario y podemos insertar datos posteriormente en la tabla. Esta es una diferencia con la sentencia DROP TABLE, que produce la eliminación tanto del contenido de la tabla como de la definición de la misma.

7 Selección

La recuperación de los datos en el lenguaje SQL se realiza mediante la sentencia SELECT, seleccionar. Esta sentencia permite indicar al SGBD la información que se quiere recuperar. Esta es la sentencia SQL, con diferencia, más habitual. La sentencia SELECT consta de cuatro partes básicas:

La cláusula SELECT seguida de la descripción de lo que se desea ver, los nombres de las columnas a seleccionar. Esta parte es obligatoria.

La cláusula FROM seguida de la especificación de las tablas de las que se han de obtener los datos. Esta parte es obligatoria.

La cláusula WHERE seguida por un criterio de selección, una condición. Esta parte es opcional.

La cláusula ORDER BY seguida por el criterio de ordenación. Esta parte es opcional.

Una primera aproximación a la sintaxis de la sentencia SELECT puede mostrarnos la siguiente expresión:

SELECT {* | {columna,}+}FROM {tabla,}+

[WHERE condición][ORDER BY {expresiónColumna [ASC | DESC],}+];

Como una primera utilización de la sentencia SELECT podemos utilizarla para ver todas las tablas que tenemos en la base de datos.

SQL> select table_name from user_tables;

TABLE_NAME------------------------------DEPEMP

Un breve análisis de la sentencia anterior nos permite observar que hemos consultado sobre la columna llamada table_name almacenada en la tabla user_tables, que es la tabla que guarda la información sobre todas las tablas de cada usuario.

Page 15: Introducción a sistemas ORACLE

7.1 Selección de Columnas

Las columnas a seleccionar se enumeran sin más en la cláusula SELECT. Si se desea seleccionar todas las columnas de una tabla se puede hacer enumerando a todas las columnas o colocando un asterisco, *, en su lugar.

Cuando se consulta una base de datos, los nombres de las columnas se usan como cabeceras de presentación. Si éste resulta demasiado largo, corto o críptico, puede cambiarse con la misma sentencia SQL de consulta, creando un alias de columna.

SQL> select nombre "Departamento", loc "Está en" from dep; Departamento Esta en--------------- ----------Administracion ValladolidI+D BoecilloProduccion Cigales

7.2 Cláusula FROM

La cláusula FROM define las tablas de las que se van a seleccionar las columnas.

Se puede añadir al nombre de las tablas el usuario propietario de las mismas de la forma usuario.tabla. De esta manera podemos distinguir entre las tablas de un usuario y otro. Oracle siempre considera como prefijo el nombre del propietario de las tablas, aunque no se lo indiquemos. De esta forma dos o más usuarios pueden tener tablas que se llamen igual sin que surjan conflictos. Si quisiéramos acceder a las filas de la tabla dep del usuario jperez, (ademas de tener privilegios de lectura sobre esa tabla) deberíamos escribir la siguiente sentencia SQL:

SQL> select * from jperez.dep;

También se puede asociar un alias a las tablas para abreviar los nombres de las tablas. Un ejemplo se puede ver en la sentencia SQL siguiente:

SQL> select d.nombre from dep d;

7.3 Cláusula WHERE

Hasta ahora hemos visto como puede utilizarse la sentencia SELECT para recuperar todas las columnas o un subconjunto de ellas de una tabla. Pero este efecto afecta a todas las filas de la tabla, a menos que especifiquemos algo más en la cláusula WHERE. Es aquí donde debemos proponer la condición que han de cumplir todas las filas para salir en el

Page 16: Introducción a sistemas ORACLE

resultado de la consulta. La complejidad del criterio de búsqueda es prácticamente ilimitada, y en él se pueden conjugar operadores de diversos tipos con funciones de columnas, componiendo expresiones más o menos complejas.

Operadores de Comparación

Operador Operación Ejemplo

= Igualdad select * from emp where cod_dep = 100;

!=, <>, ^= Desigualdad select * from emp where cod_dep != 100;

< Menor que select * from emp where cod_dep < 200;

> Mayor que select * from emp where cod_dep > 200;

<= Menor o igual que select * from emp where cod_dep <= 200;

>= Mayor o igual que select * from emp where cod_dep >= 200;

in Igual a cualquiera de los miembros entre paréntesis

select * from emp where cod_dep in (100, 300);

not in Distinto a cualquiera de los miembros entre paréntesis

select * from emp where cod_dep not in (200);

between Contenido en el rango select * from emp where cod_emp between 100 and 199;

not between

Fuera del rango select * from emp where cod_emp not between 100 and 199;

like '_abc%'

Contiene la cadena 'abc' a partir del segundo carácter y luego cualquier cadena de caracteres

select * from emp where nombre like 'Ma%';

Operadores de Aritméticos

Operador Operación Ejemplo

+ Suma select nombre, salario+comision from emp where oficio='VENDEDOR';

- Resta select nombre from emp where sysdate-fecha_alta > 365;

* Producto select nombre, salario*12 from emp;

/ División select nombre, salario/31 from emp;

Operadores de Cadenas de Caracteres

Operador Operación Ejemplo

|| Concatenación select nombre||oficio from emp;

Page 17: Introducción a sistemas ORACLE

7.4 Cláusula ORDER BY

Se utiliza para especificar el criterio de ordenación de la respuesta a la consulta. Por defecto la ordenación es ascendente, aunque se puede especificar un orden descendente. La ordenación se puede establecer sobre el contenido de columnas o sobre expresiones con columnas. A continuación se puede ver un ejemplo de uso de la cláusula ORDER BY en la que quiere obtener un listado de los empleados ordenado de manera descendente por su salario y en caso de igualdad de salario, ordenado ascendentemente por su nombre.

SQL> select nombre, salario from emp order by salario desc, nombre;

NOMBRE SALARIO---------- ----------Cano 450000Perez 350000Roncal 350000Yuste 350000Recio 300000Sastre 300000Martin 235000Garcia 225000Garcia 210000Mateo 200000Santana 200000Rueda 175000Lopez 150000Sanz 150000 14 rows selected.

7.5 Cláusula DISTINCT

Cuando se realiza una consulta sobre una tabla en la que se extrae información de varias columnas, puede ocurrir que, si no incluimos la/s columna/s que forman la clave principal, obtengamos filas repetidas en la respuesta.

Si este comportamiento no nos resulta satisfactorio podemos utilizar la cláusula DISTINCT para eliminar las filas duplicadas obtenidas como respuesta a una consulta.

Podemos ver como funciona en el siguiente ejemplo, en el que preguntamos por los distintos oficios de nuestros empleados.

Page 18: Introducción a sistemas ORACLE

SQL> select oficio from emp;

Sin utilizar la cláusula DISTINCT obtendremos la siguiente respuesta

OFICIO-----------PresidenteDirectorSecretarioContableComercialComercialDirectorAnalistaProgramadorProgramadorDirectorAnalistaProgramadorProgramador 14 rows selected.

Pero si incluimos la cláusula DISTINCT la respuesta varía para adecuarse más a nuestras espectativas.

SQL> select distinct oficio from emp; OFICIO-----------AnalistaComercialContableDirectorPresidenteProgramadorSecretario 7 rows selected.

7.6 Funciones

Page 19: Introducción a sistemas ORACLE

Existen en SQL muchas funciones que pueden complementar el manejo de los datos en las consultas. Se utilizan dentro de las expresiones y actuan con los valores de las columnas, variables o constantes.

Se pueden incluir en las clásulas SELECT, WHERE y ORDER BY.

Pueden anidarse funciones dentro de funciones. Y existe una gran variedad de funciones para cada tipo de datos:

aritméticas, de cadenas de caracteres, de manejo de fechas, de conversión, otras, de grupo.

Funciones Aritméticas

Función Cometido Ejemplo Resultado

ABS(n) Calcula el valor absoluto de n.

select abs(-15) from dual; 15

CEIL(n) Calcula el valor entero inmediatamente superior o igual a n.

select ceil(15.7) from dual; 16

FLOOR(n) Calcula el valor entero inmediatamante inferior o igual a n.

select floor(15.7) from dual; 15

MOD(m,n) Calcula el resto resultante de dividir m entre n.

select mod(11,4) from dual; 3

POWER(m,n) Calcula la potencia n-esima de m.

select power(3,2)

from dual; 9

ROUND(m,n)

Calcula el redondeo de m a n decimales. Si n<0 el redondeo se efectua a por la izquierda del punto decimal.

select round(123.456,1) from dual;

123.5

SQRT(n) Calcula la raíz cuadrada de n.

select sqrt(4) from dual; 2

TRUNC(m,n) Calcula m truncado a n decimales (n puede ser negativo).

select trunc(123.456,1) from dual;

123.4

SIGN(n) Calcula el signo de n, devolviendo -1 si n<0, 0 si n=0 y 1 si n>0.

select sign(-12) from dual; -1

Funciones de Cadenas de Caracteres

Page 20: Introducción a sistemas ORACLE

Función Cometido Ejemplo Resultado

CHR(n)

Devuelve el carácter cuyo valor codificado es n.

select chr(65) from dual; A

ASCII(cad)

Devuelve el valor ascii de cad.

select ascii('A') from dual; 65

CONCAT(cad1,cad2)

Devuelve cad1 concatenada con cad2. Esta función es esquivalente al operador ||.

select concat(concat(nombre,' es '),oficio) from emp;

Cano es Presidente, etc.

LOWER(cad)

Devuelve la cadena cad con todas sus letras convertidas a minúsculas.

select lower('MinUsCulAs') from dual;

minusculas

UPPER(cad)

Devuelve la cadena cad con todas sus letras convertidas a mayúsculas.

select upper('maYuSCulAs') from dual;

MAYUSCULAS

INITCAP(cad)

Devuelve cad con el primer caracter en mayúsculas.

select initcap('isabel') from dual;

Isabel

LPAD(cad1,n,cad2) Devuelve cad1 con longitud n, y ajustada a la derecha,

select lpad('P',5,'*') from dual;

****P

Page 21: Introducción a sistemas ORACLE

rellenando por la izquierda con cad2.

RPAD(cad1,n,cad2)

Devuelve cad1 con longitud n, y ajustada a la izquierda, rellenando por la derecha con cad2.

select rpad('P',5,'*') from dual; P****

REPLACE(cad,ant,nue)

Devuelve cad en la que cada ocurrencia de la cadena ant ha sido sustituida por la cadena nue.

select replace('digo','i','ie') from dual;

diego

SUBSTR(cad,m,n)

Devuelve la sudcadena de cad compuesta por n caracteres a partir de la posicion m.

select substr('ABCDEFG',3,2) from dual;

CD

LENGTH(cad) Devuelve la longitud de cad.

select length('cadena') from dual;

6

Funciones de Manejo de Fechas

Función Cometido Ejemplo Resultado

SYSDATE

Devuelve la fecha y hora actuales.

select sysdate from dual;

14-MAR-97

ADD_MONTHS(d,n) Devuelve la fecha d incrementa

select add_months(sysdate,4) from dual;

14-JUL-97

Page 22: Introducción a sistemas ORACLE

da en n meses.

LAST_DAY(d)

Devuelve la fecha del último día del mes de d.

select last_day(sysdate) from dual;

31-MAR-97

MONTHS_BETWEEN(d1, d2)

Devuelve la diferencia en meses entre las fechas d1 y d2.

select months_between(sysdate,'01-JAN-97') from dual;

2.43409424

NEXT_DAY(d,cad)

Devuelve la fecha del primer día de la semana cad después de la fecha d.

select next_day(sysdate, 'sunday') from dual;

16-MAR-97

Funciones de Conversión de Tipos

Función Cometido Ejemplo Resultado

TO_NUMBER(cad,fmto)

Convierte la cadena cad a un número, opcionalmente de acuerdo con el formato fmto.

select to_number('12345') from dual;

124345

TO_CHAR(d, fmto)

Convierte la fecha d a una cadena de caracteres, opcionalmente de acuerdo con el formato fmto.

select to_char(sysdate) from dual;

'14-MAR-97'

TO_DATE(cad,fmto)

Convierte la cadena cad de tipo varchar2 a fecha, opcionalmente de acuerdo con el formato fmto.

select to_date('1-JAN-97') from dual;

01-JAN-97

Page 23: Introducción a sistemas ORACLE

Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la presentación de una fecha. En la siguiente tabla se presentan algunos formatos de fecha y el resultado que generan.

Máscaras de Formato Numéricas

Formato Cometido Ejemplo Resultado

cc ó scc Valor del siglo. select to_char(sysdate,'cc') from dual; 20

y,yyy ó sy,yyy

Año con coma, con o sin signo.

select to_char(sysdate,'y,yyy') from dual;

1,997

yyyy ó yyy ó yy ó y

Año sin signo con cuatro, tres, dos o un dígitos.

select to_char(sysdate,'yyyy') from dual;

1997

q Trimestre. select to_char(sysdate,'q') from dual; 1

ww ó w Número de la semana del año o del mes.

select to_char(sysdate,'ww') from dual; 11

mm Número del mes. select to_char(sysdate,'mm') from dual; 03

ddd ó dd ó d

Número del día del año, del mes o de la semana.

select to_char(sysdate,'ddd') from dual;

073

hh ó hh12 ó hh24

La hora en formato 12h. o 24h.

select to_char(sysdate,'hh') from dual; 12

mi Los minutos de la hora.

select to_char(sysdate,'mi') from dual; 15

ss ó sssss Los segundos dentro del minuto, o desde las 0 horas.

select to_char(sysdate,'sssss') from dual;

44159

Máscaras de Formato de Caracteres

Formato Cometido Ejemplo Resultado

syear ó year

Año en Inglés select to_char(sysdate,'syear) from dual;

nineteen ninety-seven

month o mon

Nombre del mes o su abreviatura de tres letras.

select to_char(sysdate,'month') from dual;

march

day ó dy

Nombre del día de la semana o su abreviatura de tres letras.

select to_char(sysdate,'day') from dual;

friday

a.m. ó El espacio del día. select p.m.

Page 24: Introducción a sistemas ORACLE

p.m. to_char(sysdate,'a.m.') from dual;

b.c. ó a.d.

Indicador del año respecto al del nacimiento de Cristo.

select to_char(sysdate,'b.c.') from dual;

a.d.

Otras Funciones

Función Cometido Ejemplo Resultado

DECODE(var, val1, cod1, val2, cod2, ..., defecto)

Convierte el valor de var, de acuerdo con la codificación.

select decode(oficio, 'Presidente', 'P', 'Director', 'D', 'X') from emp;

P, D, X, ...

GREATEST(exp1, exp2, ...)

Devuelve el mayor valor de una lista.

sin ejemplo. sin ejemplo.

LEAST(cad,fmto) Devuelve el menor valor de una lista.

sin ejemplo. sin ejemplo.

NVL(val, exp)

Devuelve la expresión exp si val es NULL, y val si en otro caso.

select salario+nvl(comision,0) from emp;

450000, 350000, ...

7.7 Cláusula GROUP BY

SQL nos permite agrupar las filas resultado de una consulta en conjuntos y aplicar funciones sobre esos conjuntos de filas.

La sintaxis es la siguiente:

SELECT {* | {columna,}+}FROM {tabla,}+

WHERE condiciónGROUP BY {columna ,}+

HAVING condiciónORDER BY {expresiónColumna [ASC | DESC],}+;

En la cláusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la cláusula HAVING se especifica la condición que han de cumplir los grupos para pasar al resultado.

Page 25: Introducción a sistemas ORACLE

La evaluación de las diferentes cláusulas en tiempo de ejecución se efectúa en el siguiente orden:

WHERE filtra las filas GROUP BY crea una tabla de grupo nueva HAVING filtra los grupos ORDER BY clasifica la salida

Un ejemplo de utilización de la selección de grupos puede ser seleccionar los empleados agrupados por su oficio. Un primer intento de consulta es el siguiente:

SQL> select nombre, oficio from emp group by oficio; select nombre, oficio from emp *ERROR at line 1:ORA-00979: not a GROUP BY expression

Se presenta un error debido a que cuando se utiliza GROUP BY, las columnas implicadas en el SELECT y que no aparezcan en la cláusula GROUP BY deben tener una función de agrupamiento. En otras palabras, la columna nombre debe tener una función de agrupamiento que actue sobre ella (max, min, sum, count, avg). Si no puede ser así, deberá llevar dicha columna a la cláusula GROUP BY.

De nuevo, el ejemplo quedará así:

SQL> select count(nombre), oficio from emp group by oficio; COUNT(NOMBRE) OFICIO------------- ----------- 2 Analista 2 Comercial 1 Contable 3 Director 1 Presidente 4 Programador 1 Secretario 7 rows selected.

Las funciones de agrupamiento que se pueden utilizar son las siguientes.

Funciones de Agrupamiento

Page 26: Introducción a sistemas ORACLE

Función Cometido Ejemplo

COUNT(col) Cuenta el número de filas agrupadas.

select count(nombre),oficio from emp group by oficio;

AVG(col) Calcula el valor medio de todos los valores de la columna col.

select avg(salario),oficio from emp group by oficio;

MAX(col) Calcula el valor máximo de todos los valores de la columna col.

select max(salario),oficio from emp group by oficio;

MIN(col) Calcula el valor mínimo de todos los valores de la columna col.

select min(salario),oficio from emp group by oficio;

SUM(col) Calcula la suma de los valores de la columna col.

select sum(salario), oficio from emp group by oficio;

STDDEV(col)

Calcula la desviación típica de los valores de la columna col sin tener en cuenta los valores nulos.

select stddev(salario), oficio from emp group by oficio;

VARIANCE(col)

Calcula la varianza de los valores de la columna col sin tener en cuenta los valores nulos.

select variance(salario), oficio from emp group by oficio;

Hay que tener en cuenta que los valores nulos no participan en el cálculo de las funciones de conjuntos. Estas funciones se pueden utilizar con las cláusulas DISTINCT y ALL. También se pueden utilizar aunque no realicemos agrupación alguna en la consulta, considerando a toda la tabla como un grupo.

SQL> select count(*) from emp; COUNT(*)---------- 14

7.8 Expresiones con Sentencias Select

El resultado de cada consulta es un conjunto de filas. Y con conjuntos se pueden realizar tres operaciones típicas: la unión, la intersección y la diferencia.

Unión, UNIONCombina todas las filas del primer conjunto con todas las filas del segundo. Cualquier fila duplicada se reducirá a una sóla.

Intersección, INTERSECT

Page 27: Introducción a sistemas ORACLE

Examinará las filas de los conjuntos de entrada y devolverá aquellas que aparezcan en ambos. Todas las filas duplicadas serán eliminadas antes de la generación del conjunto resultante.

Diferencia, MINUS Devuelve aquellas filas que están en el primer conjunto pero no en el segundo. Las filas duplicadas del primer conjunto se reducirán a una fila única antes de empezar la comparación con el segundo conjunto.

Reglas para el Manejo de los Operadores de Conjuntos:

Pueden ser encadenados en cualquier combinación, siendo evaluados de izquierda a derecha.

No existe jerarquía de precedencia en el uso de estos operadores, pero puede ser forzada mediante paréntesis.

Pueden ser empleados con conjuntos de diferentes tablas siempre que se apliquen las siguientes reglas:

o Las columnas son relacionadas en orden, de izquierda a derecha. o Los nombres de las columnas son irrelevantes. o Los tipos de datos deben coincidir.

Como ejemplo podemos consultar sobre todos los nombres de empleado que trabajan para los departamentos 100 o 300. Esto se consigue restando a todos los nombres de empleados, aquellos que están en el departamento 200.

SQL> select nombre from emp 2 minus 3 select nombre from emp where cod_dep=200;

NOMBRE----------CanoLopezMartinRecioRoncalRuedaSantanaSanzYuste 9 rows selected.

7.9 Combinaciones

Hasta ahora hemos construido consultas con una única tabla, pero esto no debe ser siempre así.

Page 28: Introducción a sistemas ORACLE

De hecho, sólo se alcanza la verdadera potencia del SQL cuando combinamos el contenido de más de una tabla.

Supongamos que queremos conseguir una lista con los empleados y los departamentos para los que trabajan. Esta información está repartida en las dos tablas que tenemos, emp y dep. Así, podríamos intentar una consulta que seleccionara el campo nombre de la tabla emp y el nombre del departamento. Y aquí surge el primer problema, ¿cómo distinguimos entre dos columnas que llamándose igual, pertenecen a tablas distintas? Para eso se utiliza como prefijo o el nombre de la tabla (dep.nombre) o un alias de tabla, un nombre que se asocia a cada tabla y se coloca como prefijo a la columna (d.nombre).

Realicemos la consulta ...

SQL> select e.nombre, d.nombre from emp e, dep d; NOMBRE NOMBRE---------- ---------------Cano AdministracionRoncal AdministracionRueda AdministracionMartin AdministracionSanz AdministracionLopez AdministracionPerez AdministracionSastre AdministracionGarcia AdministracionMateo AdministracionYuste AdministracionRecio AdministracionGarcia AdministracionSantana AdministracionCano I+DRoncal I+DRueda I+D...42 rows selected.

El resultado puede sorprender un poco. Lo que obtenemos es el producto cartesiano de todos los empleados por todos los departamentos. SQL ha cogido cada fila de la tabla emp y le ha asociado todos los cod_dep de la tabla dep.

Para conseguir lo que queremos tenemos que forzar que se asocie a un empleado con el nombre del departamento para el que trabaja. Y esto se puede hacer si añadimos la condición de que el cod_dep tenga el mismo valor en la fila de la tabla emp que en la fila escogida de la tabla dep:

Page 29: Introducción a sistemas ORACLE

SQL> select e.nombre, d.nombre from emp e, dep d 2> where e.cod_dep = d.cod_dep; NOMBRE NOMBRE---------- ---------------Cano AdministracionRoncal AdministracionRueda AdministracionMartin AdministracionSanz AdministracionLopez AdministracionPerez I+DSastre I+DGarcia I+DMateo I+DYuste ProduccionRecio ProduccionGarcia ProduccionSantana Produccion 14 rows selected.

De la misma manera se pueden combinar más de dos tablas. Lo importante es emparejar los campos que han de tener valores iguales.

Reglas de Combinación:

Pueden combinarse tantas tablas como se desee. El criterio de combinación puede estar formado por más de una pareja de

columnas. En la cláusula SELECT pueden citarse columnas de ambas tablas, condicionen o

no la combinación. Si hay columnas con el mismo nombre en las distintas tablas, deben identificarse

especificando la tabla de procedencia o utilizando un alias de tabla.

Existe un tipo especial de combinación llamada Combinación Externa. Suponga que se crea un nuevo departamento, (insert into dep values (400,'Distribucion','Valladolid');) pero todavía no hemos asignado personal al mismo. Si realizamos la consulta anterior, el nuevo departamento no aparecerá en la respuesta. Pero esto se puede evitar si señalamos en la cláusula WHERE la posibilidad de que en la tabla de empleados no exista alguno de los códigos de departamento que si exista en la tabla de departamentos. Esto se hace colocando un (+) de la siguiente manera:

SQL> select e.nombre, d.nombre 2 from emp e, dep d

Page 30: Introducción a sistemas ORACLE

3 where e.cod_dep(+)=d.cod_dep; NOMBRE NOMBRE---------- ---------------Cano AdministracionRoncal AdministracionRueda AdministracionMartin AdministracionSanz AdministracionLopez AdministracionPerez I+DSastre I+DGarcia I+DMateo I+DYuste ProduccionRecio ProduccionGarcia ProduccionSantana Produccion Distribucion 15 rows selected.

7.10 Subconsultas

A veces se han de utilizar en una consulta los resultados de otra consulta, llamada subconsulta.

Un ejemplo de esto ocurre cuando queremos conocer los nombres de los empleados cuyo salario está por encima de la media:

SQL> select nombre from emp 2 where salario > (select avg(salario) from emp); NOMBRE----------CanoRoncalPerezSastreYusteRecio 6 rows selected.

Page 31: Introducción a sistemas ORACLE

La consulta más interna calcula el salario medio, y la consulta más externa lo utiliza para seleccionar los nombres que ganan más que la media.

El valor de comparación puede ser un valor simple, como en el ejemplo anterior, o un conjunto de valores. Hay que tener en cuenta este detalle ya que el tipo de operador a utilizar varía. En el primer caso se puede utilizar un operador de comparación de carácter aritmético (<, >, etc.). Y en el segundo uno de tipo lógico (IN).

Las subconsultas pueden devolver más de una columna, y se habrán de comparar de manera consecuente:

Las columnas de la clausula WHERE de la consulta principal deben estár agrupadas por parentesis.

Las columnas encerradas entre paréntesis deben coincidir en número y tipo de datos con los datos que devuelve la subconsulta.

El nivel de anidamiento de subconsultas es ilimitado.

Se puede utilizar una subconsulta para insertar valores en una tabla en el momento de la creación de la misma con la cláusula AS. Si quisieramos crear una tabla con los datos de los empleados del departamento 200 lo podríamos hacer de la siguiente manera:

SQL> create table dep200 (nombre, oficio) 2 as select nombre,oficio from emp 3 where cod_dep=200;

Table created.

No es necesario especificar tipos ni tamaños de las columnas, ya que vienen determinados por los tipos y tamaños de las columnas recuperadas en la subconsulta.

8 Eliminación

Cuando una tabla ya no es útil y no vamos a volver a necesitarla debe ser borrada. Esta operación se puede realizar con el comando DROP TABLE.

DROP TABLE tabla [CASCADE CONSTRAINTS];

Se borra la tabla de la base de datos, borrando toda la información contenida en la tabla, es decir, todas las filas. También se borrará toda la información que sobre la tabla existiera en el diccionario.

Puede que si alguna columna de esta tabla a borrar sirva como clave ajena de alguna tabla detalle, impida la eliminación de la tabla, ya que existe una restricción que

Page 32: Introducción a sistemas ORACLE

requiere de la existencia de la tabla maestra. Esto se puede areglar colocando la coletilla CASCADE CONSTRAINTS. Esto produce que las restricciones de la tabla detalle se borren antes de borrar la tabla maestra.

La siguiente sentencia produce la eliminación de la tabla de departamentos.

SQL> drop table dep cascade constraints; Table dropped.

9 Vistas

Una vista es como una ventana a través de la cual se puede consultar o cambiar información de la tabla a la que está asociada.

Las vistas tienen la misma estructura que una tabla: filas y columnas. La única diferencia es que sólo se almacena de ellas la definición, no los datos. Los datos que se recuperan mediante una consulta a una vista se presentarán igual que los de una tabla. De hecho, si no se sabe que se está trabajando con una vista, nada hace suponer que es así. Al igual que sucede con una tabla, se pueden insertar, actualizar, borrar y seleccionar datos en una vista. Aunque siempre es posible seleccionar datos de una vista, en algunas condiciones existen restricciones para realizar el resto de las operaciones sobre vistas.

¿Por qué utilizar vistas?

Las vistas pueden proporcionar un nivel adicional de seguridad. Por ejemplo, en la tabla de empleados, cada responsable de departamento sólo tendrá acceso a la información de sus empleados. La siguiente sentencia produce la creación de la vista de los empleados del departamento de administración (cod_dep=100).

SQL> create view ampAdmin as 2 select * from ep where cod_dep=100;View created.

Las vistas permiten ocultar la complejidad de los datos. Una BD se compone de muchas tablas. La información de dos o más tablas puede recperarse utilizando una combinación de dos o más tablas, y estas combinaciones pueden llegar a ser muy confusas. Creando una vista como resultado de la combinación se puede ocultar la complejidad al usuario.

Las vistas ayudan a mantener unos nombres razonables.

Creación de una Vista

CREATE VIEW vista [({columna ,}+] AS consulta ;

Page 33: Introducción a sistemas ORACLE

La vista se crea con las columnas que devuelve una consulta. Si no nos importa que las columnas de la vista hereden los nombres de las columnas recuperadas en la consulta no tenemos que especificarlos.

Borrado de una Vista

DROP VIEW vista ;

9.1 Operaciones sobre Vistas

Consultas

La consultas sobre las vistas se tratan de igual modo que sobre las tablas.

Actualizaciones

La información puede ser actualizada en las vistas directamente o a través de las tablas sobre las que se definen.

Esisten algunas restricciones:

Borrado de filas de una tabla a través de una vista La vista se debe crear con filas de una sola tabla; sin utilizar las cláusulas GROUP BY y DISTINCT; y sin utilizar funciones de grupo o referencias a pseudocolumnas (ROWNUM).

Actualización de filas a través de una vista La vista ha de estar definida según las restricciones anteriores y además ninguna de las columnas a actualizar debe haber sido definida como una expresión.

Inserción de filas en una tabla a través de una vista Todas las restricciones y además todas las columnas obligatorias de la tabla asociada deben estar presentes en la vista.

9.2 Vistas de más de una Tabla

Se pueden definir vistas sobre más de una tabla. Por ejemplo, sobre la combinación de dos tablas.

Podemos querer ver todos los datos de los empleados del departamento Administración.

SQL> create view depAdmin (cod_emp, nombre_emp, nombre_dep, dir) 2 as select e.cod_emp, e.nombre, d.nombre, d.loc 3 from emp e, dep d 4 where e.cod_dep=d.cod_dep and d.nombre='Administracion';

Page 34: Introducción a sistemas ORACLE

SQL> select * from depAdmin; COD_EMP NOMBRE_EMP NOMBRE_DEP DIR---------- ---------- --------------- ---------- 101 Cano Administracion Valladolid 102 Roncal Administracion Valladolid 103 Rueda Administracion Valladolid 104 Martin Administracion Valladolid 105 Sanz Administracion Valladolid 106 Lopez Administracion Valladolid 6 rows selected.

10 Jugando con los Nombres

A continuación dos comandos que permiten jugar con los nombres de los objetos en SQL: SINONYM y RENAME.

10.1 Sinónimos

SQL permite crear un sinónimo para una tabla o vista. Esto supone que pueden utilizarse dos nombres diferentes para un mismo objeto.

Creación de un Sinónimo

CREATE SYNONYM sinonimo FOR [usuario.]{tabla | vista} ;

Borrado de un Sinónimo

DROP SYNONYM sinonimo ;

Una primera utilidad de los sinónimos es la posibilidad de independizar las aplicaciones de los nombres físicos de las tablas que manejan. Asi, las aplicaciones harán referencia a un sinónimo de tabla, que en cada caso puede estar asociado a una tabla distinta.

Otra utilidad es la posibilidad de que un usuario acceda a las tablas de otro usuario como si fueran suyas, siempre que tenga permiso para hacerlo, si al definir el sinónimo incluye el nombre del usuario en la denominación de la tabla. Así si el usuarioA tiene permiso para leer el contenido de la tabla emp del usuarioB, entonces desde la ejecución

Page 35: Introducción a sistemas ORACLE

de la sentencia CREATE SYNONYM plantilla FOR usuarioB.emp verá la tabla usuarioB.emp como plantilla.

10.2 Comando RENAME

El comando RENAME se utiliza para modificar el nombre de una tabla, vista o sinónimo.

La sintásis es la siguiente

RENAME {tabla | vista | sinonimo} to nuevoNombre ;

Esta sentencia cambiará el nombre antiguo por el nuevo, y a partir de este momento cualquier acceso al objeto por el nombre antiguo será respondido con un mensaje de error.

Conviene resaltar la diferencia entre el comando SYNONYM y el comando RENAME. Mientras que el primero mantiene el nombre original para acceder al objeto, el segundo elimina ese primer nombre sustituyendolo por el nuevo.

11 Lo Más SQL*Plus

En este apartado vamos a profundizar un poco en las otras posibilidades que nos brinda SQL*Plus en los:

ficheros de comandos, y generación de informes,

11.1 Ficheros de Comandos

Aunque ya vimos una introducción a los ficheros de comandos en anteriormente, vamos ahora a profundizar un poco en las posibilidades que nos ofrece SQL*Plus.

En un fichero de comandos se pueden incluir:

líneas de comentarios, líneas de ejecución, líneas de comandos SQL, y líneas de comandos SQL*Plus.

Líneas de Comentarios

Se pueden introducir comentarios en una archivo de comandos de tres maneras:

Page 36: Introducción a sistemas ORACLE

Utilizando del comando REM del SQL*Plus. Utilizando los delimitadores de comentario de SQL /* y */. Utilizando los símbolos de comentario PL/SQL "__".

Líneas de Ejecución

Constan de una única barra inclinada, "/", y se introducen a continuación de cada sentencia SQL indicando su ejecución.

Sustituyen al punto y coma, ";" al final de las sentencias SQL.

Líneas de Comandos SQL

Se puede introducir cualquiera de los comandos SQL enumerados en este curso, y se ejecutarán de manera secuencial.

Se permite el anidamiento de los ficheros de comandos.

Líneas de Comandos SQL*Plus

SQL*Plus aporta una serie de posibilidades al lenguaje SQL que le acerca un poco mas a lo que entendemos como un lenguaje de programación.

Se pueden definir constantes y variables, capturar datos del teclado, introducir parámetros en la llamada de un archivo de comandos, y alguna cosa más.

Variables de Usuario

Se pueden definir Variables de usuario con el comando DEFINE

DEFINE Variable = valorPara borrar una variable se utiliza el comando UNDEFINE UNDEFINE variable

Como ejemplo se puede definir la variable OFICIO

SQL> define oficio=analista

Variables de Sustitución

Las variables de sustitución son un nombre de variable de usuario con el símbolo & delante. Cuando SQL*Plus detecta una variable de sustitución en un comando, ejecuta el comando tomando el valor de la variable.

Esto se puede ver en el ejemplo, donde preguntamos por los empleados que son analistas:

SQL> define oficio=Analista

Page 37: Introducción a sistemas ORACLE

SQL> define tabla=empSQL> select nombre, oficio from &tabla where oficio='&oficio';old 1: select nombre, oficio from &tabla where oficio='&oficio'new 1: select nombre, oficio from emp where oficio='Analista' NOMBRE OFICIO---------- -----------Sastre AnalistaRecio Analista

Captura de Datos desde el Terminal

En muchas ocasiones es necesario recoger datos desde un terminal, que luego serán utilizados en el archivo de comandos. Para realizarlo se pueden utilizar dos medios: las variables de sustitución o los parámetros en la línea de comandos.

Cuando SQL*Plus reconoce una variable de sustitución sin valor asignado se lo pide al usuario:

SQL> select * from dep where nombre='&nombredep';Enter value for nombredep: I+Dold 1: select * from dep where nombre='&nombredep'new 1: select * from dep where nombre='I+D' COD_DEP NOMBRE LOC---------- --------------- ---------- 200 I+D Boecillo

Si se desea que SQL*Plus pregunte por el valor de la variable al usuario sólo la primera vez que se encuentra con ella, se colocará "&&" delante de la variable de usuario.

También se pueden utilizar hasta nueve parámetros en la línea de comandos cuando se llama a la ejecución de un archivo de comandos.

En el archivo de comandos nos referiremos a los parámetros con las variables &1, &2, ... ,&9 que se corresponden posicionalmente con ellos.

Desde el archivo de comandos se puede hacer referencia a los parámetros cualquier número de veces y en cualquier orden.

Comandos de Comunicación con el Usuario

Los siguientes comandos proporcionan un medio de comunicación con el usuario:

Page 38: Introducción a sistemas ORACLE

PROMPT: presenta un mensaje en la pantalla. ACCEPT: Solicita un valor y lo almacena en la variable de usuario que se

especifíque. PAUSE: Obliga al usuario a pulsar Return despué de leer un mensaje.

Para ver cómo funcionan sirve el siguiente ejemplo:

prompt Buscar los datos de un empleado.pause Pulse Return.accept nombremp prompt 'Empleado? 'select * from emp where nombre='&nombremp';

Otros Comandos

Los siguientes comandos también se pueden incluir en un archivo de comandos:

CONNECT: para conectarse como otro usuario. HELP: para obtener ayuda en línea. EXIT: para dejar SQL*PLus y salir al Sistema Operativo. DESCRIBE ó DESC: para obtener información sobre la estructura de una tabla. HOST o !: para ejecutar un comando del Sistema Operativo.

11.2 Generación de Informes

Con SQL*Plus podemos dar forma a los resultados de las consultas para producir un informe. Podremos:

Cambiar las cabeceras de las columnas. Dar forma a las columnas de tipo number, varchar2, date y long. Copiar y listar atributos de presentación de las columnas. Suprimir valores duplicados e introducir espacios para mejorar la presentación. Realizar y mostrar cálculos (totales, medias, mínimos, máximos, etc.). Definir las dimensiones de las páginas. Ubicar títulos en la cabecera y pie de las páginas. Introducir la fecha o el número de página en los títulos.

Pero de todo esto sólo vamos a ver el modo de realizar las operaciones más comunes y sencillas.

Básicamente, el formato con el que se van a presentar los resultados de las cosultas dependen de unos parámetros y de unos comandos.

Parámetros

SET LINESIZE: pone el número máximo de caracteres por línea. Por defecto vale 80 y el máximo es 999.

Page 39: Introducción a sistemas ORACLE

SET PAGESIZE: pone el número de filas de la salida antes de empezar una nueva página. Por defecto es 25. Incluye el título y las líneas de pausa.

SET HEADING [ON | OFF]: Activa/desactiva la utilización de encabezados de columnas. Por defecto está activado.

SET NULL texto: Indica la cadena de caracteres que hay que colocar en sustitución de los valores NULL. Por defecto es "".

SET ECHO [ON | OFF]: Activa/desactiva la visualización de los comandos que SQL*Plus ejecuta según van siendo tratados. Por defecto está desactivada.

SET FEEDBACK [ n | ON | OFF]: Muestra el número de registros recuperados en cada consulta cuando se recuperan n o más registros. ON se pueden considerar como n=1, y OFF como n=0.

SET VERIFY [ON | OFF]: Controla la salida de confirmación para los valores de las variables de sustitución. Por defecto está activado.

Comandos

TTITLE: formación del encabezado de página. BTITLE: formación del pie de página. COLUMN: formatear cada columna. BREAK: puntos de ruptura en los listados. COMPUTE: realizar cálculos con las columnas.

introducción a sistemas ORACLE:

Sesiones SQL*Plus Para hacer la conexión a SQL*Plus, es necesario conectarse via telnet a altair.usb.ve.

Page 40: Introducción a sistemas ORACLE

Una vez indicado el login (de la forma ci3391xx) y el correspondiente password, se debe entrar al manejador PL/SQL, tecleando:

$ sqlplus loginname

A continuación se pedirá el password para el acceso al manejador (no necesariamente igual al password para altair). Una vez tecleado el password, aparecerá el prompt de PL/SQL:

SQL>

Otra forma de entrar a PL/SQL es tecleando desde la linea de comandos de UNIX:

$ sqlplus loginname/password

¿Cómo cambiar el password? Una vez que se está trabajando con el manejador, es posible cambiar el password, con el comando:

SQL> alter user loginname identified by newPassword;

donde loginname indica el login usado en el manejador PL/SQL y newPassword es la nueva clave a usar.

Salir de SQL*Plus Para salir de SQL*Plus basta con teclear en la linea de comandos de ORACLE:

SQL> quit;

Creación de esquemas

En SQL*Plus es posible usar todos los comandos básicos de SQL con algunas restricciones de sintaxis. Para crear una tabla, debe teclearse en la linea de comandos:

CREATE TABLE nombretabla ({nombre_col tipo [DEFAULT expr] [rest_columna] ...|rest_tabla}[,{nombre_col tipo [DEFAULT expr] [rest_columna] ...|rest_tabla}] ...);

Donde nombretabla representa el nombre que se le dara a la relación que se está creando; nombre_col es el nombre de un atributo, y tipo indica el tipo de datos del mismo; DEFAULT expr representa el valor por defecto de un atributo (el valor que se asigna cuando no se especifican datos de entrada para ese atributo); rest_columna son las restricciones a nivel de atributo que se pueden colocar; y rest_tabla las restricciones a nivel de la relación (por ejemplo, si la clave está constituida por un solo atributo, se

Page 41: Introducción a sistemas ORACLE

puede indicar como restricción a nivel de columna, en cambio, si es compuesta, se indica como restricción a nivel de tabla).

Un ejemplo lo tenemos con:

SQL> CREATE TABLE empleado (2> ci NUMBER(8) CONSTRAINT pk_empleado PRIMARY KEY,3> nombre VARCHAR2(20) NOT NULL4> CONSTRAINT may CHECK (nombre=UPPER(nombre)),5> cargo VARCHAR2(9),6> jefe NUMBER CONSTRAINT fk_jefe REFERENCES empleado(ci),7> ingreso DATE,8> sueldo NUMBER(10,2),9> dpto NUMBER(2) NOT NULL10> CONSTRAINT fk_dpto REFERENCES depto(nro)11> );

Note que mientras no se cierra la sentencia completa de SQL (con punto y coma) aparece un prompt con el número de linea que se esta escribiendo. La sentencia solo se ejecuta luego de escribir el punto y coma y presionar [ENTER].

Note además que los comandos en SQL no son case sensitive, por lo cual no habra diferencia entre una tabla empleado y una tabla EMPLEADO.

La sentencia anterior crea una relación empleado, con las siguientes características:

cedula: Entero de longitud 8, clave primaria; nombre: Cadena de caracteres de hasta 20 caracteres, no puede contener nulos, y todas las letras deben ser mayusculas; cargo: Cadena de caracteres de hasta 9 caracteres, sin restricciones; jefe: Número de cédula de identidad del jefe, es clave foránea de la misma relación en el atributo ci; ingreso: Fecha en la cual comenzó a trabajar en la empresa; sueldo: Número en punto flotante, de hasta diez dígitos, incluyendo dos decimales, que indica el sueldo mensual del empleado; dpto: Número del departamento para el cual trabaja el empleado, es clave foránea del atributo nro, de la relación depto.

Tipos de datos

Tipo Descripción CHAR(n) Cadena de caracteres de longitud n. Una vez que se declara, se reserva espacio para n caracteres, aun cuando no se usen todos. VARCHAR2(n) Cadena de caracteres de longitud n. Se define un máximo de n caracteres, pero solo se usa el espacio correspondiente a los caracteres ocupados VARCHAR(n) Exactamente lo mismo que VARCHAR2(n) NUMBER(p,s) Número en punto flotante, de p dígitos, de los cuales s son decimales. El parámetro s puede ser omitido, con lo cual se considerará que su valor es 0. El valor por defecto para p es 38. DATE Fecha comprendida entre Enero 1, 4712 aC y Diciembre 31, 4712 dC.

Page 42: Introducción a sistemas ORACLE

Inserción de tuplas Para insertar tuplas en una relación se usa la instrucción INSERT de SQL:

SQL> INSERT INTO tabla VALUES (valor1, valor2, . . ., valorN);

Por ejemplo, para insertar una nueva tupla en la relación empleado, basta con escribir:

SQL> INSERT INTO empleado VALUES (2 12325432, 'Juen Jose', 'Gil', 125000.003 );

Para la inserción de fechas, debe especificarse el formato en que se está intorduciendo la fecha, usando para ello:

TO_DATE ("string de fecha", "formato")

por ejemplo, si se quisiera ingresar en la relación empleado anterior, un atributo con la fecha de nacimiento, deberia agregarse la misma, de la siguiente manera:

SQL> INSERT INTO empleado VALUES (2 12325432, 'Juen Jose', 'Gil', 3 125000.00, TO_DATE ('15-02-72', 'DD-MM-YY')4 );

Si se quisiera ademas, agregar la hora de nacimiento, deberia usarse:

SQL> INSERT INTO empleado VALUES (2 12325432, 'Juen Jose', 'Gil', 125000.00, 3 TO_DATE ('15-02-72 15:23', 'DD-MM-YY HH24:MI')4 );

A continuación se presenta una tabla con algunos de los formatos mas usados:

Formato Descripción HH, HH12 Hora en el formato tradicional 1-12 HH24 Hora en el formato de 24 horas (0-23) MI Minutos (0-59) DD Dia del mes (1-31 con restricciones) D Dia de la semana (0=domingo) MM Mes en formato numerico (1-12) MON Nombre del mes abreviado a tres caracteres, en inglés (JAN=Enero) MONTH Nombre del mes en inglés. En caso de ser un nombre corto, se rellena con espacios en blanco hasta nueve caracteres (MARCH=marzo, JANUARY=enero, . . .) YY Año en formato de dos dígitos (se asume 19xx) YYYY Año en formato de 4 dígitos.

Eliminando tablas Para eliminar una tabla determinada, se usa la instrucción DROP TABLE, de la siguiente manera:

Page 43: Introducción a sistemas ORACLE

SQL> DROP TABLE nombretabla;

Con lo cual se elimina la tabla nombretabla del sistema.

Un caso especial se presenta si la relación a ser eliminada está referenciada por claves foráneas en otra(s) relación(es). En este caso, se debe hacer la llamada de la siguiente manera:

SQL> DROP TABLE nombretabla CASCADE CONSTRAINTS;

De esta manera se eliminarán todas las tuplas en otras relaciones que referencien a la clave primaria de la relación a ser eliminada. Si no se incluye el parámetro CASCADE CONSTRAINTS y existe alguna referencia a una tupla que se eliminará, ORACLE retornará un mensaje de error y no eliminará la relación.

creacion de scripts en oracle

La creación de relaciones e inserción de valores en las mismas suele ser un proceso bastante tedioso, especialmente cuando se transcriben errores en las instrucciones. Para simplificar esto, es posible crear Scripts que permiten crear, modificar y eliminar relaciones, así como insertar, eliminar y buscar tuplas.

Un script no es mas que un archivo de texto, con instrucciones de SQL separadas por punto y coma. Dichos archivos deben tener permiso de lectura para el usuario (100), y para ejecutar su contenido se debe usar la instrucción START, de la siguiente manera:

SQL> START scriptname

SQL> @ scriptname //forma abreviada

Oracle Bulk Loader

-Creación del archivo de control -Usando un archivo de datos separado -Representación de fechas -Manejo de valores nulos -Cargando los datos -Creación del archivo de control

Hay dos formas de usar los archivos de control. A. Datos cargados desde el archivo de controlProbablemente el tipo de archivo de control mas sencillo es como el siguiente, donde los datos a ser cargados se encuentran al final del archivo de control. Las letras mayúsculas son opcionales.

LOAD DATAINFILE *INTO TABLE testFIELDS TERMINATED BY ','(num,name)

Page 44: Introducción a sistemas ORACLE

BEGINDATA1,foo2, bar3,baz4,glorp5,snarf

El proposito de este archivo es cargar datos en una relación llamada test, la cual tiene dos atributos: num y name,de tipo NUMBER y CHAR(10), respectivamente. El significado de cada una de las líneas (en el orden que aparecen) es:

LOAD DATA se requiere esta línea al principio del archivo de control. INFILE * indica que los datos aparecerán en el mismo archivo, y no en uno separado, en cuyo caso el nombre del archivo reemplazaría a *. La inserción se efectuará en la relación llamada test. La tabla que recibirá los datos debe existir en la base de datos. Mas aún, la tabla debe estar vacía. De no cumplirse esto último, debe usarse "APPEND INTO TABLE test" en lugar de "INTO TABLE test". El separador de valores de diferentes atributos será una coma. BEGIN DATA indica que en las líneas siguientes aparecerán las tuplas a ser insertadas. La primera tupla tiene num=1 y name='foo' Los nombres de las columnas a ser insertadas aparecen entre paréntesis, y separados por coma. Observación: Un error común es asumir que los espacios en blanco son ignorados en el archivo de carga, tal como sucede en casi todos los lenguajes de programación. Este error podría producir resultados inesperados al momento de efectuar consultas sobre los datos insertados.

Notese que en las segunda tupla insertada aparece un espacio en blanco entre la coma y el nombre bar. Esto producirá como resultado que se almacene la tupla (2, ' bar') en lugar de la tupla (2, 'bar'), por locual, al hacer una consulta donde nombre='bar', nunca se obtendría dicha tupla.

B. Datos cargados desde un archivo separadoSe pueden colocar los datos a ser cargados en un archivo distinto al archivo de control. He aquí un ejemplo sencillo:

LOAD DATAINFILE 'test.txt'APPEND INTO TABLE testFIELDS TERMINATED BY ','(num,name)

A continuación, el significado de cada una de las líneas: LOAD DATA: se requiere esta línea al principio del archivo de control. INFILE test.txt indica que los datos aparecerán en el archivo test.txt. Los datos en test.txt será añadidos al final de la relación test. De no aparecer la palabra APPEND, la relación test debe estar vacía. En el archivo de datos, se usará la coma como separador de atributos. Los nombres de las columnas aparecen entre paréntesis, y separados por coma. El contenido del archivo de datos test.txt es:

Page 45: Introducción a sistemas ORACLE

1,foo2, bar3,baz4,glorp5,snarf

Representación de fechasEl tipo de datos DATE es representado en un formato que brinda considerable flexibilidad. Primero, debe declararse la tabla con un atributo de tipo DATE. He aquí un ejemplo sencillo: CREATE TABLE Foo (i NUMBER,d DATE);

Ahora, en el archivo de control, al describir los atributos de la tabla a ser cargada, puede acompañarse cada nombre de atributo con su tipo. Aún cuando esto puede hacerse para todos los atributos, en el siguiente ejemplo se hará solo para el atributo de fecha (d).

En el ejemplo tenemos, seguido del indicador de tipo DATE, una máscara de fecha que describe el formato que va a tener la fecha en los datos de entrada. La máscara de fecha es una cadena de caracteres, encerrada con comillas dobles, que debe seguir las siguientes convenciones:

Las secuencias de letras que comiencen con d, m o y, denotan campos en los datos que deben ser interpretados como dias, meses y años, respectivamente. Como casi todo en SQL, se permiten letras mayúsculas. Todos los demás caracteres son tratados literalmente, y deben aparecer en los datos, si fueron colocados en la máscara. Los campos usados representan longitud maxima para los valores correspondientes. He aquí un ejemplo de un archivo de carga:

LOAD DATAINFILE *INTO TABLE FooFIELDS TERMINATED BY ','(i,d DATE "dd-mm-yyyy")BEGINDATA1,01-02-12342,3-4-1997

Notese que, en la segunda tupla de datos, se tiene un campo de longitud menor a la indicada en la máscara. El separador - le indica al programa que los campos dia y mes para la segunda tupla son mas cortos.

Manejo de valores nulosPara la inserción de valores nulos, debe dejarse vacío el espacio correspondiente al valor. Por ejemplo, si quisieramos hacer la carga en una tabla empleado de los siguientes datos:

Page 46: Introducción a sistemas ORACLE

(12234765,'Freedy Arias',30-10-1997,120000.00)(14236879,'Jose Montenegro',12-08-1997,75535.00)(12234765,'Pedro Perez',NULL,100000,00)(12234765,'Carolina Rodriguez',30-10-1997,98000.00)

se tendría que usar el siguiente archivo de control:

LOAD DATAINFILE *INTO TABLE empleadoFIELDS TERMINATED BY ','(ci,nombre,ult_vacaciones DATE "dd-mm-yyyy",sueldo)BEGINDATA12234765,Freedy Arias,30-10-1997,120000.0014236879,Jose Montenegro,12-08-1997,75535.0012234765,Pedro Perez,,100000,00)12234765,Carolina Rodriguez,30-10-1997,98000.00

Uso del Loader para la carga de datossqlload es un comando a nivel de UNIX, igual que sqlplus. La forma de una línea de comandos es:

sqlload userid=<yourName>/<yourPasswd> control=<ctlFile> log=<logFile>

La sintaxis de los parámetros no es la usual en UNIX. Se debe colocar la palabra userid con un signo de igual, el login (de sqlplus), un slash, y el password de sqlplus. Si se omite el parámetro userid, el sistema preguntará por el login y el password.

A continuación debe indicarse el nombre del archivo de control. Por último se debe indicar el nombre de otro archivo, el archivo de log, en el cual sqlload coloca cierta información de utilidad acerca de lo que hizo, incluyendo una descripción de los erores que hubieran ocurrido durante la ejecución. Por ejemplo, si el usuario CURSO00, con password prof%01 quisiera cargar los datos que se indican en carga.ctrl y obtener el resultado en carga.log, debería usar:

sqlload userid=CURSO00/prof%01 control=carga.ctrl log=carga.log

Creación de vistas de oracle

Una vista es una tabla logica, que muestra una parte de la base de datos. Las vistas permiten "almacenar" de manera logica los resultados de los queries.

La sintaxis para crear una vista es la siguiente:

CREATE [OR REPLACE] VIEW name [(alias1, alias2, . . . , aliasN)]AS subquery

El uso de OR REPLACE permite sobreescribir una vista existente. Si se omite, y la vista ya existe, se producirá, un error. El subquery representa un query escrito en SQL, a partir del cual se obtendrá el contenido de la vista. Los aliases opcionales, permiten

Page 47: Introducción a sistemas ORACLE

asignarle nombres a las columnas de la vista. Si se omiten, las columnas tendrán el mismo nombre que en las tablas originales (de donde se obtuvieron).

A continuación se presenta un ejemplo de creación de una vista

SQL> CREATE VIEW ComputerScience (employ_name, annual_salary)1> AS SELECT ename, sal*122> FROM employee3> WHERE dpt_name = 'Computer Science'4> ;

Esta vista mostrará el salario anual de todos los empleados del departamento de Computer Science.

Si se modifica la información de alguna de las tablas base referenciadas por la vista, y luego se ejecuta un query sobre la misma, la información que se obtendrá será la nueva. Es decir, la información no se almacena en la vista, sino que se carga dinamicamente al momento de efectuar alguna consulta.

Si se desea eliminar (borrar) una vista, se usa la instrucción:

SQL> DROP VIEW name;

Bloques de instrucciones PL/SQL

A continuación se muestra como es la estructura general de los bloques de instrucciones de PL/SQL que se usarán mas adelante en la creación de procedimientos, funciones y triggers.

PL/SQL (Procedural Language/SQL) es una extensión de SQL, que agrega ciertas construcciones propias de lenguajes procedimentales, obteniendose como resultado un lenguaje estructural mas poderoso que SQL. La unidad de programación utilizada por PL/SQL es el bloque. Todos los programas de PL/SQL están conformados por bloques. Tipicamente, cada bloque lleva a cabo una acción lógica en el programa. Un bloque tendrá siempre la siguiente estructura:

DECLARE

//Sección declarativa: variables, tipos, y subprogramas//de uso local

BEGIN

//Sección ejecutable: las instrucciones procedimentales, y de SQL //aparecen aquí. Es la unica sección obligatoria en el bloque.

EXCEPTION

//Sección de manejo de excepciones. Las rutinas de manejo de errores//aparecen aqui

Page 48: Introducción a sistemas ORACLE

END;

Solo se requiere que aparezca la sección ejecutable. Lo demas es opcional. Las unicas instrucciones SQL permitidas en un bloque PL/SQL son INSERT, UPDATE, DELETE y SELECT, ademas de algunas instrucciones para manipulación de datos, e instrucciones para control de transacciones. Otras instrucciones de SQL como DROP, CREATE o ALTER no son permitidas. Se permite el uso de comentarios estilo C (/* . . .*/). PL/SQL no es case sensitive por lo que no hay distinción entre nombres con mayusculas y minusculas.

En la sección de declaraciones, se indican las variables que serán usadas dentro del bloque y sus tipos. Por ejemplo:

DECLAREmyBeer VARCHAR(20);price NUMBER(6,2);

En algunos casos, es posible que se desee que el tipo de una variable coincida con el tipo usado para una columna de una tabla determinada, en esos casos se puede usar la construcción:

DECLAREmyBeer Beers.name%TYPE;

Con lo cual se logra que la variable myBeer tenga el mismo tipo que la columna name de la tabla Beers.

Tambien es posible inicializar las variables, mediante el operador :=. Ademas, mediante el uso del mismo operador es posible hacer asignaciones en el cuerpo del programa. Por ejemplo:

DECLAREprice NUMBER := 300;BEGINprice := price + 150;END;.run

La ejecución de este bloque no tendrá ningun efecto, ya que no se están haciendo cambios sobre la base de datos.

Ademas es posible usar sentencias condicionales y ciclos dentro de los bloques de PL/SQL. Una sentencia condicional tipica es de la forma:

IF (condicion)THEN (lista de acciones)ELSE (lista de acciones)END IF;

Page 49: Introducción a sistemas ORACLE

Si se desea, se puede hacer el uso de varios casos de condición, mediante el uso de:

IF . . . THEN . . . ELSIF . . . THEN . . . ELSIF . . . THEN . . ....ELSE . . .END IF;

En ambos casos, la clausula ELSE es opcional.

Si se desea crear un lazo, se puede usar la instrucción:

LOOPlista_de_instruccionesEND LOOP;

Al menos alguna de las instrucciones debe ser:

EXIT WHEN condicion;

De esta manera, el lazo terminará cuando la condición sea verdadera. Además es posible utilizar la instrucción:

WHILE (condicion) LOOPlista_de_instruccionesEND LOOP;

De esta forma, el ciclo solo se inicia si la condicion es verdadera en principio. Es posible que el programa nunca entre en el ciclo. Usando la instrucción LOOP se garantizaba que siempre se ejecutaría el cuerpo del ciclo al menos una vez. Por último, es posible usar ciclos que se ejecuten un numero predeterminado de veces, mediante el uso de la instrucción:

FOR i IN a..b LOOPlista_de_instruccionesEND LOOP;

En este caso i es una variable de uso local, por lo que no es necesario que sea declarada, y puede ser usada dentro del lazo, mientras que a y b son constantes.

Procedimientos almacenados

Un procedimiento almacenado es un conjunto de instrucciones en PL/SQL, que pueden ser llamado usando el nombre que se le haya asignado.

La sintaxis para crear un procedimiento es la siguiente:

Page 50: Introducción a sistemas ORACLE

CREATE [OR REPLACE] PROCEDURE name [(param [IN|OUT|IN OUT|] datatype) . . .][IS|AS] pl/sql_subprogram

El uso de OR REPLACE permite sobreescribir un procedimiento existente. Si se omite, y el procedimiento ya existe, se producirá un error. Los modificadores IN, OUT, IN OUT indican si el parametro es de entrada, salida o ambos.

A continuación se presenta un ejemplo de creación de un procedimiento:

SQL> CREATE PROCEDURE credit (acc_no IN NUMBER, amount IN NUMBER)1> AS BEGIN2> UPDATE accounts3> SET balance = balance + amount4> WHERE account_id = acc_no;5> END;

Este procedimiento actualizará la(s) tupla(s) con numero de cuenta igual al parámetro acc_no con un incremento de amount en el balance de dicha cuenta.

Si se desea eliminar (borrar) un procedimiento almacenado, se usa la instrucción:

SQL> DROP PROCEDURE name;

Funciones en oracle

Una función es un conjunto de instrucciones en PL/SQL, que pueden ser llamados usando el nombre con que se le haya creado. Se diferencian de los procedimientos, en que las funciones retornan un valor al ambiende desde donde fueron llamadas.

La sintaxis para crear una función es la siguiente:

CREATE [OR REPLACE] FUNCTION name [(param [IN] datatype) . . .]RETURN datatype[IS|AS] pl/sql_subprogram

El uso de OR REPLACE permite sobreescribir una función existente. Si se omite, y la función ya existe, se producirá, un error. El unico modificador permitido para los parámetros es IN, y si se omite, se tomará por defecto. Es decir, solo se permiten parámetros de entrada.

A continuación se presenta un ejemplo de creación de una función:

SQL> CREATE FUNCTION get_bal (acc_no IN NUMBER)1> RETURN NUMBER2> IS3> acc_bal NUMBER(11,2); /* declaración de una variable */4> BEGIN5> SELECT balance6> INTO acc_bal /* asignación */

Page 51: Introducción a sistemas ORACLE

7> FROM accounts8> WHERE account_id = acc_no;9> RETURN(acc_bal);10> END

La función get_bal retorna el balance de una cuenta dada.

Si se desea eliminar (borrar) una función, se usa la instrucción:

SQL> DROP FUNCTION name;

Triggers

Un trigger es un bloque PL/SQL asociado a una tabla, que se ejecuta cuando una determinada instrucción en SQL se va a ejecutar sobre dicha tabla.

La sintaxis para crear un trigger es la siguiente:

CREATE [OR REPLACE] TRIGGER {BEFORE|AFTER} {DELETE|INSERT|UPDATE [OF col1, col2, . . ., colN][OR {DELETE|INSERT|UPDATE [OF col1, col2, . . ., colN]. . .]}ON table[REFERENCING OLD AS oldname, NEW as newname][FOR EACH ROW [WHEN (condition)]]pl/sql_block

El uso de OR REPLACE permite sobreescribir un trigger existente. Si se omite, y el trigger existe, se producirá, un error.

El modificador FOR EACH ROW indica que el trigger se disparará cada vez que se desee hacer operaciones sobre una fila de la tabla. Si se acompaña del modificador WHEN, se establece una restricción; el trigger solo actuará, sobre las filas que satisfagan la restricción.

A continuación se presenta un ejemplo de creación de un trigger:

SQL> CREATE TRIGGER salary_check1> BEFORE2> INSERT OR UPDATE OF sal, job3> ON employee4> FOR EACH ROW5> WHEN (new.job <> 'PRESIDENT')6> DECLARE7> minsal NUMBER8> maxsal NUMBER9> BEGIN10> /* Se obtienen los valores minimo y maximo para el salario de */11> /* un cargo determinado, usando la tabla sal_guide */12> SELECT minsal, maxsal13> INTO minsal, maxsal

Page 52: Introducción a sistemas ORACLE

14> FROM sal_guide15> WHERE job = :new.job16> /* Si el salario del empleado a insertar/modificar esta por */17> /* debajo del minimo, o por encima del maximo, se genera */19> /* un error. */20> IF (:new.sal < minsal OR :new.sal > maxsal)21> THEN raise_application_error(-20601, 'Salary '||:new.sal||22> ' out of range for job '||:new.job||' for employee '||23> :new.ename);24> END IF;25 > END;

Este trigger impide que se agregue o modifique un empleado con el sueldo mayor o menor que los valores maximo y minimo respectivamente para su cargo. Se agrega la restricción de que el trigger no se dispararán si el cargo es PRESIDENTE.

Si se desea eliminar (borrar) un trigger, se usa la instrucción:

SQL> DROP TRIGGER name;