Está en la página 1de 51

Introducin al SQL

Este curso pretende ser una introduccin al SQL, y en particular a la versin 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 administracin que se pueden considerar en SQL. Slo se ha pretendido introducir y explicar los comandos ms utilizados con sus opciones ms tiles, dejando los detalles ms especficos 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 interaccin con el texto y de mayor difusin. Por ahora las tablas de ejemplo son estticas y se encuentran en el texto mismo, pero mi intencin es que se pueda interactuar con una base de datos en tiempo real. Quizs ms adelante?. Si tienes cualquier sugerencia o encuentras una errata escondida dmelo. Abril de 1998. Jess Vegas Dpto. Informtica Universidad de Valladolid jvegas@infor.uva.es

ndice
1. Terminologa 2. Tipos de sentencias SQL 3. SQL*Plus o Conexin o Posibilidades de Edicin o Utilizacin de Ficheros 4. Creacin o Tipos de Columnas o Restricciones o Comando DESCRIBE 5. Modificacin 6. Insercin, Actualizacin y Borrado o Insercin o Actualizacin o Borrado 7. Seleccin o Seleccin de Columnas o Clusula FROM o Clusula WHERE

Clusula ORDER BY Clusula DISTINCT Funciones Clusula GROUP BY Expresiones con Sentencias SELECT Combinaciones Subconsultas 8. Eliminacin 9. Vistas 10. Jugando con los Nombres o Sinnimos o El Comando RENAME 11. Lo Mas SQL*Plus o Ficheros de Comandos o Generacin de Informes
o o o o o o o

1 Terminologa
SQL Structured Query Language o Lenguaje de Consultas Estructurado. Es el lenguaje que permite la comunicacin 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 Cmo ni Dnde conseguirlo. El SQL es relacionalmente completo. Permite la realizacin de cualquier consulta de datos. SQL= DDL + DML Las sentencias del SQL se clasifican como parte del DDL o del DML. Lenguaje de Definicin 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 Manipulacin 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 operacin 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 modificacin se trasladen a la base de datos y perduren en el tiempo hay que confirmar dicha operacin con el comando commit. Tambin se puede impedir que los ltimos cambios lleguen a efectuarse con rollback, aunque existen algunas sentencias SQL que se 'autoconfirman' y no se pueden volver atrs. Diccionario de la Base de Datos

Guarda la definicin de todos los objetos almacenados en la base de datos; sus caractersticas, restricciones, privilegios, relaciones entre ellos, etc.

2 Tipos de Sentencias
Las sentencias SQL pertenecen a dos categoras principales: Lenguaje de Definicin de Datos, DDL y Lenguaje de Manipulacin 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 funcin 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 informacin almacenada en los objetos de la base de datos. Cuando se ejecutan las sentencias DDL de SQL, el SGBD confirma la transaccin actual antes y despus de cada una de las sentencias DDL. En cambio, las sentencias DML no llevan implcito 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 continuacin se presenta una tabla con las sentencias SQL ms comunes, clasificadas segn el lenguaje al que pertenecen. Sentencia DDL Alter procedure Alter Table Objetivo Recompilar un procedimiento almacenado.

Aadir o redefinir una columna, modificar la asignacin de almacenamiento. Recoger estadsticas de rendimiento sobre los objetos de la BD Analyze 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 Objetivo DML Insert Aadir 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 Rollback

Confirmar como permamentes las modificaciones realizadas. Deshacer todas las modificaciones realizadas desde la ltima confirmacin.

3 SQL*Plus
La herramienta que nos proporciona ORACLE para interactuar con la base de datos se llama SQL*Plus. Bsicamente, es un intrprete SQL con algunas opciones de edicin 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 Conexin
Para entar en SQL*Plus se debe ejecutar el comando

$ sqlplus usuario/passwd
donde le indicamos al SGBD Oracle quin somos y nuestra palabra clave. Si la configuracin del SGBD Oracle se corresponde a una configuracin clienteservidor asentada sobre una red (SQL*Net v2) deberemos indicar, adems, el sevicio (o base de datos) con el que queremos contactar. Esto se hace colocando el smbolo @ antes del nombre del servicio como se indica a continuacin:

$ sqlplus usuario/passwd@servicio
Otra circunstancia que hay que tener en cuenta a la hora de conectarnos a SQL*Plus es el modo establecido por el DBA para la autentificacin del usuario de la base de datos. La primera posibilidad es que recaiga sobre el SGBD Oracle la autentificacin 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 quin somos ya que el SO se ha encargado previamente de comprobar que todo es correcto. En este segundo caso, el comando de conexin con SQL*Plus debe omitir el nombre de usuario y la palabra clave, pero manteniendo el resto de esta manera:

$ sqlplus /@servicio
Una vez que hemos conseguido entrar en SQL*Plus nos presenta el prompt y espera la inserccin de sentencias SQL. Todas las sentencias deben acabar con un ';'. Una sentencia puede continuar en varias lneas, que SQL*Plus va numerando. Si queremos anular la sentencia actual podemos hacerlo colocando un '.' como nico carcter en una lnea. 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 smbolo '@' al nombre del fichero. Para cerrar la sesin vale con teclear 'exit'.

3.2 Posibilidades de Edicin


SQL*Plus almacena en un buffer la ltima sentencia SQL introducida. El buffer mantiene slo 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 / que ejecuta la sentencia sin visualizarla.

antes de ejecutarla;

SQL*Plus tambin nos permite editar la sentencia SQL alamacenada en el buffer mediante un sencillo (y limitado) editor en lnea, cuyos comandos se enumeran a continuacin: Comando APPEND texto Descripcin Aade texto al final de la lnea. Cambia el contenido 'fuente' por el CHANGE/fuente/destino C/fuente/destino 'destino' CHANGE/texto C/texto Quita 'texto' de una lnea. CLEAR BUFFER CL BUFF Borra el buffer DEL DEL Borra una lnea. INPUT I Inserta una o ms lneas. INPUT texto I texto Inserta una lnea con 'texto'. LIST L Lista las lneas del buffer LIST n Lnn Lista la lnea n-sima. LIST * L* Lista la lnea actual. LIST LAST L LAST Lista la ltima lnea. Lista las lneas desde la m-sima a la LIST m n Lmn n-sima. Abreviatura A texto

Al contenido del buffer tambin 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=vi SQL> edit

3.3 Utilizacin 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 extensin .lst (o lo manda a la impresora). Los comandos asociados con los ficheros spool son
SPOOL fichero SPOOL OUT SPOOL OFF EXIT

Manda el resultado de las consultas al fichero. Manda el resultado de las consultas a la impresora. Cierra el fichero de spool. 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 extensin .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 ms posibilidades en relacin con los ficheros de comandos, la comunicacin con el usuario final y la generacin 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 captulo con algunas de las cosillas que quedan por contar del SQL*Plus.

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

Antes de llevar a cabo la creacin de una tabla conviene planificar:


nombre de la tabla, nombre de cada columna, tipo y tamao de los datos almacenados en cada columna, informacin adicional, restricciones, etc.

Hay que tener en cuenta tambin ciertas restricciones en la formacin de los nombres de las tablas: longitud mxima de 30 caracteres, no puede haber nombres de tabla duplicados, deben comenzar con un carcter alfabtico, permitir caracteres alfanumricos y el guin bajo '_', y Oracle no distingue entre maysculas y minsculas. La sintaxis del comando que permite crear un tabla es la siguiente:

CREATE TABLE [esquema.]tabla ({columna tipoColumna [NOT NULL],}+, {CONSTRAINT nombreRestriccin {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 informacin de naturaleza distinta. Los tipos de datos ms comunes y sus caractersticas se resumen en la siguiente tabla. Tipo de Dato Descripcin Almacena datos de tipo carcter alfanumrico de longitud VARCHAR2(tamao) variable, con un tamao mximo de 2.000. Almacena datos de tipo carcter alfanumrico de longitud CHAR(tamao) fija, con un tamao mximo de 255. Almacena datos de tipo carcter alfanumrico de longitud LONG variable con un tamao mximo de hasta 2 Gb. Almacena datos numricos de dig dgitos, de los cuales NUMBER(dig,dec) dec son decimales. El tamao mximo es de 38 dgitos.
DATE

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

RAW(tamao) LONG RAW

4712 DC. Almacena datos de longitud variable, con un tamao mximo de 255 bytes. Almacena datos de longitud variable, con un tamao mximo 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 vlidas y todas las restricciones se han cumplido. Las restricciones se van a definir acompaadas por un nombre, lo que permitir activarlas o desactivarlas segn sea el caso; o tambin mezcladas en la definiciones de las columnas de la tabla. A continuacin 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

DEFAULT CHECK

Evita valores repetidos en una columna, admitiendo valores nulos. Oracle crea un ndice automticamente cuando se habilita esta restriccin y lo borra al deshabilitarse. Establece un valor por defecto para esa columna, si no se le asigna ninguno. Comprueba que se cumpla una condicin determinada al rellenar esa columna. Esta condicin slo debe estar construida con columnas de esta misma tabla. Establece el conjunto de columnas que forman la clave primaria de esa tabla. Se comporta como nica y obligatoria sin necesidad de explicitarlo. Slo puede existir una clave primaria por tabla. Puede ser referenciada como clave ajena por otras tablas. Crea un ndice automticamente cuando se habilita o se crea esta restriccin. En Oracle, los ndices son construidos sobre rboles B+.

PRIMARY KEY

FOREIGN KEY

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 lmite en el nmero 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 tambin. Esto se consigue aadiendo la coletilla ON DELETE CASCADE en la definicin de la clave ajena. Seguidamente se presenta un ejemplo en el que se crean dos tablas, una de departamentos y otra de empleados:

REM REM tabla departamento con un cdigo de departamento, un nombre y una REM localizacin. REM create 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')) ); REM REM tabla empleado con un cdigo de empleado, un nombre, un oficio, un REM jefe, una fecha de alta en la empresa, un salario mensual, una REM comisin y el cdigo del departamento donde trabaja. REM create 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), 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 segn nos alejemos del momento de creacin de una tabla.

La sintsis es la siguiente

DESCRIBE tabla
Y un ejemplo de su utilizacin se puede ver al describir la definicin de las dos tablas creadas antes. Como no es una sentencia SQL no necesita el ';' al final. Tambin 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)

5 Modificacin
Despus de crear una tabla, a veces nos encontramos con que se necesita aadir una columna adicional o modificar la definicin de una columna existente. Esta operacin 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 tamao de un columna. En las modificaciones, los tipos anterior y nuevo deben ser compatibles, o la tabla debe estar vaca. La opcin ADD ... NOT NULL slo ser posible si la tabla est vaca.

La opcin MODIFY ... NOT NULL slo podr realizarse cuando la tabla no contenga ninguna fila con valor nulo en la columna en cuestin.

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

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


Tambin se puede querer modificar una tabla aadiendo o eliminando restricciones. En este caso el comando a utilizar ser

ALTER TABLE tabla {ADD | DROP} CONSTRAINT restriccin;

6 Insercin, Actualizacin 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 continuacin vamos a estudiar tres de las sentencias DML ms comunes.

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

INSERT INTO tabla [({columna,}*)] VALUES ({expresin,}+);


Slo 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 asociacin 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 continuacin se puede ver la insercin de filas en las tablas de ejemplo.

REM insertar filas en la tabla dep insert 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 emp insert 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-MAR96',175000,null,100); insert into emp values (104,'Martin','Contable',102,'17-MAR96',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 (202,'Sastre','Analista',201,'8-JUN-96',300000,null,200); insert into emp values (203,'Garcia','Programador',202,'8-JUN96',225000,null,200); insert into emp values (204,'Mateo','Programador',202,'8-JUN96',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-FEB97',210000,null,300); insert into emp values (304,'Santana','Programador',302,'4-FEB97',200000,null,300);

6.2 Actualizacin
Otra de las operaciones ms comunes es la modificacin de la informacin almacenada en las tablas. Para ello se utiliza el comando UPDATE cuya sintaxis se muestra a continuacin.

UPDATE tabla SET {columna = expresin,}+ [WHERE condicin];


Se especificar en la clusula SET las columnas que se actualizarn y con qu valores. La clusula WHERE indica las filas con las que se va a trabajar. Si se omite la actualizacin afectar a todas las filas de la tabla.

6.3 Borrado
Con insertar y modificar, la otra operacin que completa el trio es la de borrado de filas. La sintaxis es la que sigue:

DELETE FROM tabla [WHERE condicin];


Borrar todas las filas que cumplan la condicin especificada en la clusula WHERE. Si esta clusula no se fija, se borrarn todas las filas de la tabla. Aqu cabe decir que aunque con DELETE borremos todas las filas de una tabla, no borramos la definicin 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 eliminacin tanto del contenido de la tabla como de la definicin de la misma.

7 Seleccin
La recuperacin de los datos en el lenguaje SQL se realiza mediante la sentencia SELECT, seleccionar. Esta sentencia permite indicar al SGBD la informacin que se quiere recuperar. Esta es la sentencia SQL, con diferencia, ms habitual. La sentencia SELECT consta de cuatro partes bsicas:

La clusula SELECT seguida de la descripcin de lo que se desea ver, los nombres de las columnas a seleccionar. Esta parte es obligatoria. La clusula FROM seguida de la especificacin de las tablas de las que se han de obtener los datos. Esta parte es obligatoria. La clusula WHERE seguida por un criterio de seleccin, una condicin. Esta parte es opcional. La clusula ORDER BY seguida por el criterio de ordenacin. Esta parte es opcional.

Una primera aproximacin a la sintaxis de la sentencia SELECT puede mostrarnos la siguiente expresin:

SELECT {* | {columna,}+} FROM {tabla,}+ [WHERE condicin] [ORDER BY {expresinColumna [ASC | DESC],}+];

Como una primera utilizacin 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 -----------------------------DEP EMP


Un breve anlisis 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 informacin sobre todas las tablas de cada usuario.

7.1 Seleccin de Columnas


Las columnas a seleccionar se enumeran sin ms en la clusula 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 presentacin. Si ste resulta demasiado largo, corto o crptico, 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 Valladolid I+D Boecillo Produccion Cigales

7.2 Clusula FROM


La clusula FROM define las tablas de las que se van a seleccionar las columnas. Se puede aadir 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 ms usuarios pueden tener tablas que se llamen igual sin que surjan conflictos. Si quisiramos acceder a las filas de la tabla dep del usuario jperez, (ademas de tener privilegios de lectura sobre esa tabla) deberamos escribir la siguiente sentencia SQL:

SQL> select * from jperez.dep;


Tambin 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 Clusula 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 ms en la clusula WHERE. Es aqu donde debemos proponer la condicin que han de cumplir todas las filas para salir en el resultado de la consulta. La complejidad del criterio de bsqueda es prcticamente ilimitada, y en l se pueden conjugar operadores de diversos tipos con funciones de columnas, componiendo expresiones ms o menos complejas. Operadores de Comparacin Operador Operacin = Igualdad Ejemplo
select * from emp where cod_dep = 100; select * from emp where cod_dep != 100; select * from emp where cod_dep < 200; select * from emp where cod_dep > 200; select * from emp where cod_dep <= 200; select * from emp where cod_dep >= 200; select * from emp where cod_dep in (100, 300); select * from emp where cod_dep not in (200); select * from emp where cod_emp between 100 and 199; select * from emp where cod_emp not between 100 and 199; select * from emp where nombre like 'Ma%';

!=, <>, ^= Desigualdad < > <= >= in not in between not between like '_abc%' Menor que Mayor que Menor o igual que Mayor o igual que Igual a cualquiera de los miembros entre parntesis Distinto a cualquiera de los miembros entre parntesis Contenido en el rango Fuera del rango Contiene la cadena 'abc' a partir del segundo carcter y luego cualquier cadena de caracteres

Operadores de Aritmticos

Operador Operacin Ejemplo + * / Suma Resta Producto Divisin


select nombre, salario+comision from emp where oficio='VENDEDOR'; select nombre from emp where sysdatefecha_alta > 365; select nombre, salario*12 from emp; select nombre, salario/31 from emp;

Operadores de Cadenas de Caracteres Operador || Operacin Concatenacin Ejemplo


select nombre||oficio from emp;

7.4 Clusula ORDER

BY

Se utiliza para especificar el criterio de ordenacin de la respuesta a la consulta. Por defecto la ordenacin es ascendente, aunque se puede especificar un orden descendente. La ordenacin se puede establecer sobre el contenido de columnas o sobre expresiones con columnas. A continuacin se puede ver un ejemplo de uso de la clusula 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 450000 Perez 350000 Roncal 350000 Yuste 350000 Recio 300000 Sastre 300000 Martin 235000 Garcia 225000 Garcia 210000 Mateo 200000 Santana 200000 Rueda 175000 Lopez 150000 Sanz 150000 14 rows selected.

7.5 Clusula DISTINCT


Cuando se realiza una consulta sobre una tabla en la que se extrae informacin 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 clusula 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.

SQL> select oficio from emp;


Sin utilizar la clusula DISTINCT obtendremos la siguiente respuesta

OFICIO ----------Presidente Director Secretario Contable Comercial Comercial Director Analista Programador Programador Director Analista Programador Programador 14 rows selected.
Pero si incluimos la clusula DISTINCT la respuesta vara para adecuarse ms a nuestras espectativas.

SQL> select distinct oficio from emp; OFICIO ----------Analista

Comercial Contable Director Presidente Programador Secretario 7 rows selected.

7.6 Funciones
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 clsulas SELECT, WHERE y ORDER BY. Pueden anidarse funciones dentro de funciones. Y existe una gran variedad de funciones para cada tipo de datos:

aritmticas, de cadenas de caracteres, de manejo de fechas, de conversin, otras, de grupo.

Funciones Aritmticas Funcin Cometido Calcula el valor absoluto de ABS(n) n. Calcula el valor entero CEIL(n) inmediatamente superior o igual a n. Calcula el valor entero FLOOR(n) inmediatamante inferior o igual a n. Calcula el resto resultante de MOD(m,n) dividir m entre n. Calcula la potencia n-esima POWER(m,n) de m. ROUND(m,n) Calcula el redondeo de m a n decimales. Si n<0 el redondeo se efectua a por la Ejemplo
select abs(-15) from dual; select ceil(15.7) from dual; select floor(15.7) from dual; select mod(11,4) from dual; select power(3,2) from dual; select round(123.456,1) from dual;

Resultado 15 16

15 3 9 123.5

izquierda del punto decimal. Calcula la raz cuadrada de SQRT(n) n. Calcula m truncado a n TRUNC(m,n) decimales (n puede ser negativo). Calcula el signo de n, SIGN(n) devolviendo -1 si n<0, 0 si n=0 y 1 si n>0. Funciones de Cadenas de Caracteres Funcin Cometido Devuelve el carcter cuyo valor codificado es n. Devuelve el valor ascii de cad. Devuelve cad1 concatenada con cad2. Esta funcin es esquivalente al operador ||. Devuelve la cadena cad con todas sus letras convertidas a minsculas. Devuelve la cadena cad con todas sus letras convertidas a maysculas. Devuelve cad con el primer Ejemplo

select sqrt(4) from 2 dual; select trunc(123.456,1) from dual; select sign(-12) from dual;

123.4

-1

Resultado

CHR(n)

select chr(65) from dual;

ASCII(cad)

select ascii('A') from dual;

65

CONCAT(cad1,cad2)

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

Cano es Presidente, etc.

LOWER(cad)

select lower('MinUsCulAs') from dual;

minusculas

UPPER(cad)

select upper('maYuSCulAs') from dual;

MAYUSCULAS

INITCAP(cad)

select initcap('isabel') from dual;

Isabel

caracter en maysculas. Devuelve cad1 con longitud n, y ajustada a la select lpad('P',5,'*') LPAD(cad1,n,cad2) derecha, from dual; rellenando por la izquierda con cad2. Devuelve cad1 con longitud n, y ajustada a la select rpad('P',5,'*') RPAD(cad1,n,cad2) izquierda, from dual; rellenando por la derecha con cad2. Devuelve cad en la que cada ocurrencia select REPLACE(cad,ant,nue) de la cadena replace('digo','i','ie') ant ha sido from dual; sustituida por la cadena nue. Devuelve la sudcadena de cad select compuesta substr('ABCDEFG',3,2) SUBSTR(cad,m,n) por n from dual; caracteres a partir de la posicion m. Devuelve la select length('cadena') LENGTH(cad) longitud de from dual; cad. Funciones de Manejo de Fechas Funcin SYSDATE

****P

P****

diego

CD

Cometido Ejemplo Devuelve la fecha y hora select sysdate from dual; actuales.

Resultado 14-MAR-97

Devuelve la select fecha d add_months(sysdate,4) from 14-JUL-97 ADD_MONTHS(d,n) incrementada dual; en n meses. Devuelve la select last_day(sysdate) fecha del LAST_DAY(d) 31-MAR-97 ltimo da del from dual; mes de d. Devuelve la diferencia en select MONTHS_BETWEEN(d1, meses entre months_between(sysdate,'01- 2.43409424 d2) las fechas d1 JAN-97') from dual; y d2. Devuelve la fecha del primer da de select next_day(sysdate, NEXT_DAY(d,cad) 16-MAR-97 'sunday') from dual; la semana cad despus de la fecha d. Funciones de Conversin de Tipos Funcin Cometido Ejemplo Resultado Convierte la cadena cad a un select nmero, to_number('12345') 124345 TO_NUMBER(cad,fmto) opcionalmente de from dual; acuerdo con el formato fmto. Convierte la fecha d a una cadena de select '14-MARto_char(sysdate) TO_CHAR(d, fmto) caracteres, 97' opcionalmente de from dual; acuerdo con el formato fmto. Convierte la cadena cad de tipo varchar2 a select to_date('1TO_DATE(cad,fmto) fecha, JAN-97') from dual; 01-JAN-97 opcionalmente de acuerdo con el formato fmto. Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la presentacin de una fecha. En la siguiente tabla se presentan algunos formatos de fecha y el resultado que generan.

Mscaras de Formato Numricas Formato cc scc y,yyy sy,yyy Cometido Valor del siglo. Ejemplo
select to_char(sysdate,'cc') from dual;

Resultado 20 1,997 1997 1 11 03 073 12 15 44159

Ao con coma, con select to_char(sysdate,'y,yyy') o sin signo. from dual;


select to_char(sysdate,'yyyy') from dual; select to_char(sysdate,'q') from dual; select to_char(sysdate,'ww') from dual; select to_char(sysdate,'mm') from dual;

Ao sin signo con yyyy yyy cuatro, tres, dos o yy y un dgitos. q ww w mm Trimestre. Nmero de la semana del ao o del mes. Nmero del mes.

Nmero del da del select ddd dd ao, del mes o de la to_char(sysdate,'ddd') from d dual; semana. hh hh12 La hora en formato select to_char(sysdate,'hh') from dual; hh24 12h. o 24h. Los minutos de la select to_char(sysdate,'mi') mi from dual; hora. Los segundos select ss sssss dentro del minuto, o to_char(sysdate,'sssss') desde las 0 horas. from dual; Mscaras de Formato de Caracteres Formato Cometido syear year month o mon Ao en Ingls Ejemplo
select to_char(sysdate,'syear) from dual; select to_char(sysdate,'month') from dual; select to_char(sysdate,'day') from dual; select to_char(sysdate,'a.m.') from dual; select to_char(sysdate,'b.c.') from dual;

Resultado nineteen ninety-seven march

Nombre del mes o su abreviatura de tres letras. Nombre del da de la semana o su day dy abreviatura de tres letras. a.m. p.m. El espacio del da.

friday

p.m. a.d.

b.c. a.d. Indicador del ao respecto al del

nacimiento de Cristo. Otras Funciones Funcin Cometido Ejemplo Convierte el select decode(oficio, DECODE(var, val1, valor de var, 'Presidente', 'P', cod1, val2, cod2, ..., de acuerdo con 'Director', 'D', 'X') defecto) la codificacin. from emp; Devuelve el GREATEST(exp1, mayor valor de sin ejemplo. exp2, ...) una lista. Devuelve el LEAST(cad,fmto) menor valor de sin ejemplo. una lista. Devuelve la expresin exp select salario+nvl(comision,0) NVL(val, exp) si val es NULL, y val si from emp; en otro caso. Resultado P, D, X, ...

sin ejemplo. sin ejemplo.

450000, 350000, ...

7.7 Clusula 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 condicin GROUP BY {columna ,}+ HAVING condicin ORDER BY {expresinColumna [ASC | DESC],}+;
En la clusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la clusula HAVING se especifica la condicin que han de cumplir los grupos para pasar al resultado. La evaluacin de las diferentes clusulas en tiempo de ejecucin se efecta 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 utilizacin de la seleccin 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 clusula GROUP BY deben tener una funcin de agrupamiento. En otras palabras, la columna nombre debe tener una funcin de agrupamiento que actue sobre ella (max, min, sum, count, avg). Si no puede ser as, deber llevar dicha columna a la clusula 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 Funcin COUNT(col) AVG(col) Cometido Cuenta el nmero de filas agrupadas. Calcula el valor medio de todos los valores de la columna col. Ejemplo
select count(nombre),oficio from emp group by oficio; select avg(salario),oficio from emp group by oficio;

Calcula el valor mximo de todos los valores de la columna col. Calcula el valor mnimo MIN(col) de todos los valores de la columna col. Calcula la suma de los SUM(col) valores de la columna col. Calcula la desviacin tpica de los valores de la STDDEV(col) columna col sin tener en cuenta los valores nulos. Calcula la varianza de los valores de la columna col VARIANCE(col) sin tener en cuenta los valores nulos. MAX(col)

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

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

Hay que tener en cuenta que los valores nulos no participan en el clculo de las funciones de conjuntos. Estas funciones se pueden utilizar con las clusulas DISTINCT y ALL. Tambin se pueden utilizar aunque no realicemos agrupacin 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 tpicas: la unin, la interseccin y la diferencia. Unin, UNION Combina todas las filas del primer conjunto con todas las filas del segundo. Cualquier fila duplicada se reducir a una sla. Interseccin, INTERSECT Examinar las filas de los conjuntos de entrada y devolver aquellas que aparezcan en ambos. Todas las filas duplicadas sern eliminadas antes de la generacin del conjunto resultante. Diferencia, MINUS Devuelve aquellas filas que estn en el primer conjunto pero no en el segundo. Las filas duplicadas del primer conjunto se reducirn a una fila nica antes de empezar la comparacin con el segundo conjunto. Reglas para el Manejo de los Operadores de Conjuntos:

Pueden ser encadenados en cualquier combinacin, siendo evaluados de izquierda a derecha. No existe jerarqua de precedencia en el uso de estos operadores, pero puede ser forzada mediante parntesis. 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 estn en el departamento 200.

SQL> select nombre from emp 2 minus 3 select nombre from emp where cod_dep=200; NOMBRE ---------Cano Lopez Martin Recio Roncal Rueda Santana Sanz Yuste 9 rows selected.

7.9 Combinaciones
Hasta ahora hemos construido consultas con una nica tabla, pero esto no debe ser siempre as. De hecho, slo se alcanza la verdadera potencia del SQL cuando combinamos el contenido de ms de una tabla. Supongamos que queremos conseguir una lista con los empleados y los departamentos para los que trabajan. Esta informacin est repartida en las dos tablas que tenemos, emp y dep. As, podramos intentar una consulta que seleccionara el campo nombre de la tabla emp y el nombre del departamento. Y aqu surge el primer problema, cmo distinguimos entre dos columnas que llamndose 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 Administracion Roncal Administracion Rueda Administracion Martin Administracion Sanz Administracion Lopez Administracion Perez Administracion Sastre Administracion Garcia Administracion Mateo Administracion Yuste Administracion Recio Administracion Garcia Administracion Santana Administracion Cano I+D Roncal I+D Rueda 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 aadimos la condicin 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:

SQL> select e.nombre, d.nombre from emp e, dep d 2> where e.cod_dep = d.cod_dep; NOMBRE NOMBRE ---------- --------------Cano Administracion Roncal Administracion

Rueda Martin Sanz Lopez Perez Sastre Garcia Mateo Yuste Recio Garcia Santana

Administracion Administracion Administracion Administracion I+D I+D I+D I+D Produccion Produccion Produccion Produccion

14 rows selected.
De la misma manera se pueden combinar ms de dos tablas. Lo importante es emparejar los campos que han de tener valores iguales. Reglas de Combinacin:

Pueden combinarse tantas tablas como se desee. El criterio de combinacin puede estar formado por ms de una pareja de columnas. En la clusula SELECT pueden citarse columnas de ambas tablas, condicionen o no la combinacin. 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 combinacin llamada Combinacin Externa. Suponga que se crea un nuevo departamento, (insert into dep values (400,'Distribucion','Valladolid');) pero todava 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 sealamos en la clusula WHERE la posibilidad de que en la tabla de empleados no exista alguno de los cdigos 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 3 where e.cod_dep(+)=d.cod_dep; NOMBRE NOMBRE ---------- --------------Cano Administracion Roncal Administracion Rueda Administracion

Martin Administracion Sanz Administracion Lopez Administracion Perez I+D Sastre I+D Garcia I+D Mateo I+D Yuste Produccion Recio Produccion Garcia Produccion Santana 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 ---------Cano Roncal Perez Sastre Yuste Recio 6 rows selected.
La consulta ms interna calcula el salario medio, y la consulta ms externa lo utiliza para seleccionar los nombres que ganan ms que la media. El valor de comparacin 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 vara. En el primer caso se puede utilizar un operador de comparacin de carcter aritmtico (<, >, etc.). Y en el segundo uno de tipo lgico (IN).

Las subconsultas pueden devolver ms de una columna, y se habrn de comparar de manera consecuente:

Las columnas de la clausula WHERE de la consulta principal deben estr agrupadas por parentesis. Las columnas encerradas entre parntesis deben coincidir en nmero 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 creacin de la misma con la clusula AS. Si quisieramos crear una tabla con los datos de los empleados del departamento 200 lo podramos 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 tamaos de las columnas, ya que vienen determinados por los tipos y tamaos de las columnas recuperadas en la subconsulta.

8 Eliminacin
Cuando una tabla ya no es til y no vamos a volver a necesitarla debe ser borrada. Esta operacin 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 informacin contenida en la tabla, es decir, todas las filas. Tambin se borrar toda la informacin 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 eliminacin de la tabla, ya que existe una restriccin que 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 eliminacin de la tabla de departamentos.

SQL> drop table dep cascade constraints; Table dropped.

9 Vistas
Una vista es como una ventana a travs de la cual se puede consultar o cambiar informacin 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 slo se almacena de ellas la definicin, no los datos. Los datos que se recuperan mediante una consulta a una vista se presentarn 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 slo tendr acceso a la informacin de sus empleados. La siguiente sentencia produce la creacin de la vista de los empleados del departamento de administracin (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 informacin de dos o ms tablas puede recperarse utilizando una combinacin de dos o ms tablas, y estas combinaciones pueden llegar a ser muy confusas. Creando una vista como resultado de la combinacin se puede ocultar la complejidad al usuario. Las vistas ayudan a mantener unos nombres razonables.

Creacin de una Vista

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


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 informacin puede ser actualizada en las vistas directamente o a travs de las tablas sobre las que se definen. Esisten algunas restricciones: Borrado de filas de una tabla a travs de una vista La vista se debe crear con filas de una sola tabla; sin utilizar las clusulas GROUP BY y DISTINCT; y sin utilizar funciones de grupo o referencias a pseudocolumnas (ROWNUM). Actualizacin de filas a travs de una vista La vista ha de estar definida segn las restricciones anteriores y adems ninguna de las columnas a actualizar debe haber sido definida como una expresin. Insercin de filas en una tabla a travs de una vista Todas las restricciones y adems todas las columnas obligatorias de la tabla asociada deben estar presentes en la vista.

9.2 Vistas de ms de una Tabla


Se pueden definir vistas sobre ms de una tabla. Por ejemplo, sobre la combinacin de dos tablas. Podemos querer ver todos los datos de los empleados del departamento Administracin.

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'; 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 106 Lopez 6 rows selected.

Administracion Valladolid Administracion Valladolid

10 Jugando con los Nombres


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

10.1 Sinnimos
SQL permite crear un sinnimo para una tabla o vista. Esto supone que pueden utilizarse dos nombres diferentes para un mismo objeto. Creacin de un Sinnimo

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


Borrado de un Sinnimo

DROP SYNONYM sinonimo ;


Una primera utilidad de los sinnimos es la posibilidad de independizar las aplicaciones de los nombres fsicos de las tablas que manejan. Asi, las aplicaciones harn referencia a un sinnimo 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 sinnimo incluye el nombre del usuario en la denominacin de la tabla. As si el usuarioA tiene permiso para leer el contenido de la tabla emp del usuarioB, entonces desde la ejecucin 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 sinnimo. La sintsis 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 Ms 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 generacin de informes,

11.1 Ficheros de Comandos


Aunque ya vimos una introduccin 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:

lneas de comentarios, lneas de ejecucin, lneas de comandos SQL, y lneas de comandos SQL*Plus.

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

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

Lneas de Ejecucin Constan de una nica barra inclinada, "/", y se introducen a continuacin de cada sentencia SQL indicando su ejecucin. Sustituyen al punto y coma, ";" al final de las sentencias SQL. Lneas de Comandos SQL

Se puede introducir cualquiera de los comandos SQL enumerados en este curso, y se ejecutarn de manera secuencial. Se permite el anidamiento de los ficheros de comandos. Lneas 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 programacin. Se pueden definir constantes y variables, capturar datos del teclado, introducir parmetros en la llamada de un archivo de comandos, y alguna cosa ms. Variables de Usuario Se pueden definir Variables de usuario con el comando DEFINE

DEFINE Variable = valor


Para borrar una variable se utiliza el comando UNDEFINE

UNDEFINE variable

Como ejemplo se puede definir la variable OFICIO

SQL> define oficio=analista


Variables de Sustitucin Las variables de sustitucin son un nombre de variable de usuario con el smbolo & delante. Cuando SQL*Plus detecta una variable de sustitucin 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 SQL> define tabla=emp SQL> 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 Analista Recio Analista

Captura de Datos desde el Terminal En muchas ocasiones es necesario recoger datos desde un terminal, que luego sern utilizados en el archivo de comandos. Para realizarlo se pueden utilizar dos medios: las variables de sustitucin o los parmetros en la lnea de comandos. Cuando SQL*Plus reconoce una variable de sustitucin sin valor asignado se lo pide al usuario:

SQL> select * from dep where nombre='&nombredep'; Enter value for nombredep: I+D old 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 slo la primera vez que se encuentra con ella, se colocar "&&" delante de la variable de usuario. Tambin se pueden utilizar hasta nueve parmetros en la lnea de comandos cuando se llama a la ejecucin de un archivo de comandos. En el archivo de comandos nos referiremos a los parmetros con las variables &1, &2, ... ,&9 que se corresponden posicionalmente con ellos. Desde el archivo de comandos se puede hacer referencia a los parmetros cualquier nmero de veces y en cualquier orden. Comandos de Comunicacin con el Usuario Los siguientes comandos proporcionan un medio de comunicacin con el usuario:

PROMPT: presenta un mensaje en la pantalla. ACCEPT: Solicita un valor y lo almacena en la variable de usuario que se especifque. PAUSE: Obliga al usuario a pulsar Return despu de leer un mensaje.

Para ver cmo 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 tambin se pueden incluir en un archivo de comandos:

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

11.2 Generacin 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 presentacin de las columnas. Suprimir valores duplicados e introducir espacios para mejorar la presentacin. Realizar y mostrar clculos (totales, medias, mnimos, mximos, etc.). Definir las dimensiones de las pginas. Ubicar ttulos en la cabecera y pie de las pginas. Introducir la fecha o el nmero de pgina en los ttulos.

Pero de todo esto slo vamos a ver el modo de realizar las operaciones ms comunes y sencillas. Bsicamente, el formato con el que se van a presentar los resultados de las cosultas dependen de unos parmetros y de unos comandos. Parmetros

SET LINESIZE: pone el nmero mximo de caracteres por lnea. Por defecto vale 80 y el mximo es 999. SET PAGESIZE: pone el nmero de filas de la salida antes de empezar una nueva pgina. Por defecto es 25. Incluye el ttulo y las lneas de pausa. SET HEADING [ON | OFF]: Activa/desactiva la utilizacin de encabezados de columnas. Por defecto est activado. SET NULL texto: Indica la cadena de caracteres que hay que colocar en sustitucin de los valores NULL. Por defecto es "". SET ECHO [ON | OFF]: Activa/desactiva la visualizacin de los comandos que SQL*Plus ejecuta segn van siendo tratados. Por defecto est desactivada. SET FEEDBACK [ n | ON | OFF]: Muestra el nmero de registros recuperados en cada consulta cuando se recuperan n o ms registros. ON se pueden considerar como n=1, y OFF como n=0. SET VERIFY [ON | OFF]: Controla la salida de confirmacin para los valores de las variables de sustitucin. Por defecto est activado.

Comandos

TTITLE: formacin del encabezado de pgina. BTITLE: formacin del pie de pgina. COLUMN: formatear cada columna. BREAK: puntos de ruptura en los listados. COMPUTE: realizar clculos con las columnas.

introduccin a sistemas ORACLE: Sesiones SQL*Plus Para hacer la conexin a SQL*Plus, es necesario conectarse via telnet a altair.usb.ve. Una vez indicado el login (de la forma ci3391xx) y el correspondiente password, se debe entrar al manejador PL/SQL, tecleando: $ sqlplus loginname A continuacin 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

Cmo 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; Creacin de esquemas En SQL*Plus es posible usar todos los comandos bsicos 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 relacin 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 relacin (por ejemplo, si la clave est constituida por un solo atributo, se puede indicar como restriccin a nivel de columna, en cambio, si es compuesta, se indica como restriccin 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 NULL 4> 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 NULL 10> 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 nmero de linea que se esta escribiendo. La sentencia solo se ejecuta luego de escribir el punto y coma y presionar [ENTER]. Note adems 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 relacin empleado, con las siguientes caractersticas: 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: Nmero de cdula de identidad del jefe, es clave fornea de la misma relacin en el atributo ci; ingreso: Fecha en la cual comenz a trabajar en la empresa; sueldo: Nmero en punto flotante, de hasta diez dgitos, incluyendo dos decimales, que indica el sueldo mensual del empleado; dpto: Nmero del departamento para el cual trabaja el empleado, es clave fornea del atributo nro, de la relacin depto. Tipos de datos Tipo Descripcin 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 mximo 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) Nmero en punto flotante, de p dgitos, de los cuales s son decimales. El parmetro 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. Insercin de tuplas Para insertar tuplas en una relacin se usa la instruccin INSERT de SQL: SQL> INSERT INTO tabla VALUES (valor1, valor2, . . ., valorN); Por ejemplo, para insertar una nueva tupla en la relacin empleado, basta con escribir: SQL> INSERT INTO empleado VALUES ( 2 12325432, 'Juen Jose', 'Gil', 125000.00 3 ); Para la insercin 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 relacin 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 continuacin se presenta una tabla con algunos de los formatos mas usados: Formato Descripcin 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 ingls (JAN=Enero) MONTH Nombre del mes en ingls. En caso de ser un nombre corto, se rellena con espacios en blanco hasta nueve caracteres (MARCH=marzo, JANUARY=enero, . . .) YY Ao en formato de dos dgitos (se asume 19xx) YYYY Ao en formato de 4 dgitos. Eliminando tablas Para eliminar una tabla determinada, se usa la instruccin DROP TABLE, de la siguiente manera: SQL> DROP TABLE nombretabla; Con lo cual se elimina la tabla nombretabla del sistema. Un caso especial se presenta si la relacin a ser eliminada est referenciada por claves forneas en otra(s) relacin(es). En este caso, se debe hacer la llamada de la siguiente manera: SQL> DROP TABLE nombretabla CASCADE CONSTRAINTS; De esta manera se eliminarn todas las tuplas en otras relaciones que referencien a la clave primaria de la relacin a ser eliminada. Si no se incluye el parmetro CASCADE CONSTRAINTS y existe alguna referencia a una tupla que se eliminar, ORACLE retornar un mensaje de error y no eliminar la relacin.

creacion de scripts en oracle La creacin de relaciones e insercin 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 instruccin START, de la siguiente manera: SQL> START scriptname SQL> @ scriptname //forma abreviada Oracle Bulk Loader -Creacin del archivo de control -Usando un archivo de datos separado -Representacin de fechas -Manejo de valores nulos -Cargando los datos -Creacin del archivo de control Hay dos formas de usar los archivos de control. A. Datos cargados desde el archivo de control Probablemente 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 maysculas son opcionales. LOAD DATA INFILE * INTO TABLE test FIELDS TERMINATED BY ',' (num,name) BEGINDATA 1,foo 2, bar 3,baz 4,glorp 5,snarf El proposito de este archivo es cargar datos en una relacin llamada test, la cual tiene dos atributos: num y name,de tipo NUMBER y CHAR(10), respectivamente. El significado de cada una de las lneas (en el orden que aparecen) es: LOAD DATA se requiere esta lnea al principio del archivo de control. INFILE * indica que los datos aparecern en el mismo archivo, y no en uno separado, en cuyo caso el nombre del archivo reemplazara a *. La insercin se efectuar en la relacin llamada test. La tabla que recibir los datos debe

existir en la base de datos. Mas an, la tabla debe estar vaca. 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 lneas siguientes aparecern las tuplas a ser insertadas. La primera tupla tiene num=1 y name='foo' Los nombres de las columnas a ser insertadas aparecen entre parntesis, y separados por coma. Observacin: Un error comn es asumir que los espacios en blanco son ignorados en el archivo de carga, tal como sucede en casi todos los lenguajes de programacin. Este error podra 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 obtendra dicha tupla. B. Datos cargados desde un archivo separado Se pueden colocar los datos a ser cargados en un archivo distinto al archivo de control. He aqu un ejemplo sencillo: LOAD DATA INFILE 'test.txt' APPEND INTO TABLE test FIELDS TERMINATED BY ',' (num,name) A continuacin, el significado de cada una de las lneas: LOAD DATA: se requiere esta lnea al principio del archivo de control. INFILE test.txt indica que los datos aparecern en el archivo test.txt. Los datos en test.txt ser aadidos al final de la relacin test. De no aparecer la palabra APPEND, la relacin test debe estar vaca. En el archivo de datos, se usar la coma como separador de atributos. Los nombres de las columnas aparecen entre parntesis, y separados por coma. El contenido del archivo de datos test.txt es: 1,foo 2, bar 3,baz 4,glorp 5,snarf Representacin de fechas El 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 acompaarse cada nombre de atributo con su tipo. An 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 mscara de fecha que describe el formato que va a tener la fecha en los datos de entrada. La mscara 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 aos, respectivamente. Como casi todo en SQL, se permiten letras maysculas. Todos los dems caracteres son tratados literalmente, y deben aparecer en los datos, si fueron colocados en la mscara. Los campos usados representan longitud maxima para los valores correspondientes. He aqu un ejemplo de un archivo de carga: LOAD DATA INFILE * INTO TABLE Foo FIELDS TERMINATED BY ',' (i,d DATE "dd-mm-yyyy") BEGINDATA 1,01-02-1234 2,3-4-1997 Notese que, en la segunda tupla de datos, se tiene un campo de longitud menor a la indicada en la mscara. El separador - le indica al programa que los campos dia y mes para la segunda tupla son mas cortos. Manejo de valores nulos Para la insercin de valores nulos, debe dejarse vaco el espacio correspondiente al valor. Por ejemplo, si quisieramos hacer la carga en una tabla empleado de los siguientes datos: (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 tendra que usar el siguiente archivo de control: LOAD DATA INFILE * INTO TABLE empleado FIELDS TERMINATED BY ',' (ci,nombre,ult_vacaciones DATE "dd-mm-yyyy",sueldo) BEGINDATA 12234765,Freedy Arias,30-10-1997,120000.00 14236879,Jose Montenegro,12-08-1997,75535.00

12234765,Pedro Perez,,100000,00) 12234765,Carolina Rodriguez,30-10-1997,98000.00 Uso del Loader para la carga de datos sqlload es un comando a nivel de UNIX, igual que sqlplus. La forma de una lnea de comandos es: sqlload userid=<yourName>/<yourPasswd> control=<ctlFile> log=<logFile> La sintaxis de los parmetros 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 parmetro userid, el sistema preguntar por el login y el password. A continuacin 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 informacin de utilidad acerca de lo que hizo, incluyendo una descripcin de los erores que hubieran ocurrido durante la ejecucin. 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, debera usar: sqlload userid=CURSO00/prof%01 control=carga.ctrl log=carga.log Creacin 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 asignarle nombres a las columnas de la vista. Si se omiten, las columnas tendrn el mismo nombre que en las tablas originales (de donde se obtuvieron). A continuacin se presenta un ejemplo de creacin de una vista SQL> CREATE VIEW ComputerScience (employ_name, annual_salary) 1> AS SELECT ename, sal*12 2> FROM employee 3> 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 informacin de alguna de las tablas base referenciadas por la vista, y luego se ejecuta un query sobre la misma, la informacin que se obtendr ser la nueva. Es decir, la informacin 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 instruccin: SQL> DROP VIEW name; Bloques de instrucciones PL/SQL A continuacin se muestra como es la estructura general de los bloques de instrucciones de PL/SQL que se usarn mas adelante en la creacin de procedimientos, funciones y triggers. PL/SQL (Procedural Language/SQL) es una extensin de SQL, que agrega ciertas construcciones propias de lenguajes procedimentales, obteniendose como resultado un lenguaje estructural mas poderoso que SQL. La unidad de programacin utilizada por PL/SQL es el bloque. Todos los programas de PL/SQL estn conformados por bloques. Tipicamente, cada bloque lleva a cabo una accin lgica en el programa. Un bloque tendr siempre la siguiente estructura: DECLARE //Seccin declarativa: variables, tipos, y subprogramas //de uso local BEGIN //Seccin ejecutable: las instrucciones procedimentales, y de SQL //aparecen aqu. Es la unica seccin obligatoria en el bloque. EXCEPTION //Seccin de manejo de excepciones. Las rutinas de manejo de errores //aparecen aqui END; Solo se requiere que aparezca la seccin 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 manipulacin 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 distincin entre nombres con mayusculas y minusculas. En la seccin de declaraciones, se indican las variables que sern usadas dentro del bloque y sus tipos. Por ejemplo:

DECLARE myBeer 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 construccin: DECLARE myBeer 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: DECLARE price NUMBER := 300; BEGIN price := price + 150; END; . run La ejecucin de este bloque no tendr ningun efecto, ya que no se estn 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; Si se desea, se puede hacer el uso de varios casos de condicin, 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 instruccin: LOOP lista_de_instrucciones END LOOP; Al menos alguna de las instrucciones debe ser: EXIT WHEN condicion; De esta manera, el lazo terminar cuando la condicin sea verdadera. Adems es posible utilizar la instruccin: WHILE (condicion) LOOP lista_de_instrucciones END 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 instruccin LOOP se garantizaba que siempre se ejecutara 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 instruccin: FOR i IN a..b LOOP lista_de_instrucciones END 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: 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 continuacin se presenta un ejemplo de creacin de un procedimiento: SQL> CREATE PROCEDURE credit (acc_no IN NUMBER, amount IN NUMBER) 1> AS BEGIN

2> UPDATE accounts 3> SET balance = balance + amount 4> WHERE account_id = acc_no; 5> END; Este procedimiento actualizar la(s) tupla(s) con numero de cuenta igual al parmetro acc_no con un incremento de amount en el balance de dicha cuenta. Si se desea eliminar (borrar) un procedimiento almacenado, se usa la instruccin: SQL> DROP PROCEDURE name; Funciones en oracle Una funcin 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 funcin 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 funcin existente. Si se omite, y la funcin ya existe, se producir, un error. El unico modificador permitido para los parmetros es IN, y si se omite, se tomar por defecto. Es decir, solo se permiten parmetros de entrada. A continuacin se presenta un ejemplo de creacin de una funcin: SQL> CREATE FUNCTION get_bal (acc_no IN NUMBER) 1> RETURN NUMBER 2> IS 3> acc_bal NUMBER(11,2); /* declaracin de una variable */ 4> BEGIN 5> SELECT balance 6> INTO acc_bal /* asignacin */ 7> FROM accounts 8> WHERE account_id = acc_no; 9> RETURN(acc_bal); 10> END La funcin get_bal retorna el balance de una cuenta dada. Si se desea eliminar (borrar) una funcin, se usa la instruccin: SQL> DROP FUNCTION name;

Triggers Un trigger es un bloque PL/SQL asociado a una tabla, que se ejecuta cuando una determinada instruccin 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 acompaa del modificador WHEN, se establece una restriccin; el trigger solo actuar, sobre las filas que satisfagan la restriccin. A continuacin se presenta un ejemplo de creacin de un trigger: SQL> CREATE TRIGGER salary_check 1> BEFORE 2> INSERT OR UPDATE OF sal, job 3> ON employee 4> FOR EACH ROW 5> WHEN (new.job <> 'PRESIDENT') 6> DECLARE 7> minsal NUMBER 8> maxsal NUMBER 9> BEGIN 10> /* Se obtienen los valores minimo y maximo para el salario de */ 11> /* un cargo determinado, usando la tabla sal_guide */ 12> SELECT minsal, maxsal 13> INTO minsal, maxsal 14> FROM sal_guide 15> WHERE job = :new.job 16> /* 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 restriccin de que el trigger no se dispararn si el cargo es PRESIDENTE. Si se desea eliminar (borrar) un trigger, se usa la instruccin: SQL> DROP TRIGGER name;

También podría gustarte