Sei sulla pagina 1di 60

Curso Informix-SQL

CURSO DE INFORMIX-SQL
Convenciones utilizadas En funcin de los posibles manejadores de base de datos Informix disponibles en el mercado, Informix Standard Engine o Informix-OnLine, las descripciones de los comandos tendrn la forma: COMANDO Descripcin Descripcin del propsito general del comando. Sintaxis: SE Sintaxis del comando para el manejador Standard Engine OL Sintaxis del comando para el manejador OnLine
Informix es una marca registrada de Informix Software, Inc.

Introduccin
Estructura del men de SQL El entorno de trabajo provisto por Informix-SQL consta de una serie de menes que permiten ejecutar todas las operaciones posibles desde el ambiente. Se presenta a continuacin la estructura del men principal: Query-language New Run Modify UserEditor Output Choose Save Info Drop Exit Report Run Modify Generate New Compile Drop Exit Form Run Modify Generate New Compile Drop Exit

Informix-SQL
Database Select Create Drop Exit UserMenu Run Modify Exit Table Create Alter Info Drop Exit

Tipos de Datos en SQL Cada columna de una base de datos debe tener asignado uno de los siguientes tipos de datos: CHAR(n) String de caracteres de longitud n, (1<=n<=32.767) Ocupa n SE y OL bytes VARCHAR(max[,min]) String de longitud variable de hasta max caracteres (1<=max<=255). Si est presente, min garantiza el nmero OL mnimo de caracteres a reservar para esa columna. El espacio que ocupa es el que insume cada fila de datos ms 1 byte para la longitud. SMALLINT SE y OL Entero entre -32.767 y 32.767 inclusive. Ocupa 2 bytes INTEGER Entero entre -2.147.483.647 y 2.147.483.647 inclusive. Ocupa 4 SE y OL bytes. DECIMAL[(m[,n])] Punto flotante decimal con m dgitos significativos (la precisin SE y OL y n dgitos a la derecha del punto decimal (la escala). m<=32 y n<=m. Default: DECIMAL(16) SMALLFLOAT Punto flotante equivalente a DECIMAL(8) SE y OL FLOAT SE y OL Punto flotante equivalente a DECIMAL(16) MONEY[(m[,n])] Equivalente al tipo DECIMAL. Cuando una columna de este SE y OL tipo es mostrada es precedida por el smbolo definido en la variable de ambiente DBMONEY. El default para n es 2, y el default es MONEY(16,2) SERIAL[(n)] A una columna con este tipo se le asigna automticamente un SE y OL entero secuencial. Si est presente, n indica el nmero inicial de la secuencia. El default para n es 1. Ocupa 4 bytes. DATE Se utiliza para almacenar fechas. Al momento de la asignacin, SE y OL se debe hacerlo mediante las comillas. El modo default para mostrar una columna de este tipo es de la forma mm dd yyyy. Las fechas son dadas internamente en notacin juliana, es decir, el nmero de das desde el 1-Ene-1900. Ocupa 4 bytes.

DATETIME c1 TO c2 SE y OL

Permite almacenar un instante de tiempo con mucha ms granularidad que un campo DATE. Su precisin puede variar de aos a fracciones de segundo. c1 y c2 pueden ser: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND o FRACTION(n), con n indicando la cantidad de dgitos significativos con un default de 3. Permite almacenar una diferencia de instantes de tiempo con mucha granularidad. Por razones de implementacin hay dos tipos de intervalos posibles. As: c1 y c2 pueden ser YEAR to MONTH o bien DAY, HOUR, MINUTE, SECOND o FRACTION(n) con n indicando la cantidad de dgitos significativos con un default de 3. Es uno de los dos posibles tipos de BLOBs (Binary Large Objects), streams de bytes de hasta 2 GBytes de capacidad, que permite almacenar informacin basada en caracteres como documentos de procesadores de palabras o archivos ASCII. Se almacenan en un espacio separado de la tabla. Es el otro tipo posible de BLOBs (Binary Large Objects) que permite almacenar informacin no basada en caracteres como imgenes digitalizadas o patrones de voz. Se almacenan en un espacio separado de la tabla.

INTERVAL c1 TO c2 SE y OL

TEXT OL

BYTE

OL

Comandos de SQL Podemos agrupar las sentencias del Informix-SQL en cinco tipos: 1 - DDL (Lenguaje de Definicin de Datos)
Base de Datos CREATE DATABASE DATABASE CLOSE DATABASE DROP DATABASE Tablas Vistas CREATE CREATE TABLE VIEW ALTER TABLE DROP VIEW RENAME TABLE DROP TABLE Sinnimos CREATE SYNONYM DROP SYNONYM Indices Generales CREATE UPDATE INDEX STATISTICS ALTER INDEX RENAME COLUMN DROP INDEX

2 - DML (Lenguaje de Manejo de Datos)


SELECT INSERT UPDATE DELETE

3 - Acceso a los datos Permisos sobre tablas o base de datos


GRANT REVOKE

Locking de tablas
LOCK TABLE UNLOCK TABLE SET LOCK MODE

4 - Integridad de los datos Transacciones


BEGIN WORK COMMIT WORK ROLLBACK WORK START DATABASE ROLLFORWARD DATABASE

Tablas
CREATE AUDIT DROP AUDIT RECOVER TABLE

5 - Sentencias Auxiliares
CHECK TABLE REPAIR TABLE LOAD UNLOAD INFO OUTPUT

Lenguaje de Definicin de Datos - DDL


En el DDL se incluyen las sentencias que nos permiten crear y/o eliminar una base de datos y sus tablas, vistas e ndices y aquellas que cambian o renombran tablas y columnas. Todas ellas trabajan sobre la base de datos actual -salvo, claro est, las que crean, seleccionan o eliminan una base de datos-. CREATE DATABASE Descripcin Esta sentencia se utiliza para crear una nueva Base de Datos. Sintaxis: SE OL CREATE DATABASE Nombre-Base-De-Datos [WITH LOG in "pathname" [MODE ANSI]] CREATE DATABASE Nombre-Base-De-Datos [IN Nombre-DBSpace] [WITH [BUFFERED] LOG] [WITH LOG MODE ANSI]

En Standard Engine, la base se crea a partir del directorio actual de trabajo, y se puede especificar el nombre del path donde ubicar el transaction log file. En OnLine la base se crea en el root dbspace, salvo que se indique lo contrario por la clusula IN. Si se usa el modo BUFFERED para el transaction log file, se mejora la performance a cambio de la posibilidad de perder las ltimas operaciones previas a una cada. En ambos casos, el modo ANSI adiciona las siguientes prestaciones: Todas las sentencias son tratadas como transacciones automticamente, en modo unbuffered Las referencias a las tablas, vistas, sinnimos, ndices, etc. deben ser hechas con el nombre del propietario, salvo que sea ste quien las invoque. Medidas de seguridad: los usuarios no reciben por default el privilegio de Public sobre las tablas y sinnimos. La base de datos creada queda como la base de datos activa.

DATABASE Descripcin Esta sentencia se utiliza para seleccionar una Base de Datos accesible como Base de Datos activa. Sintaxis DATABASE Nombre-Base-De-Datos [EXCLUSIVE] Se puede seleccionar una base de datos de otro server, especificando el nombre del mismo. Si se est trabajando con una base de datos y se usa esta sentencia, se cierra la anterior, a menos que la misma est en otro server, en cuyo caso reporta un error La clusula EXCLUSIVE se utiliza para impedir que otros usuarios ingresen a la base de datos. Si alguien la est usando, reporta un error. CLOSE DATABASE Descripcin Esta sentencia se utiliza para cerrar la Base de Datos activa. Sintaxis CLOSE DATABASE Si se est trabajando con transacciones, hay que dejarlas cerradas antes de cerrar la base de datos

DROP DATABASE Descripcin Esta sentencia se utiliza para borrar una Base de Datos completa, incluyendo todos los catlogos del sistema, ndices y datos. Sintaxis DROP DATABASE Nombre-Base-De-Datos Para poder usar esta sentencia, es necesario ser el usuario informix o tener el privilegio DBA. En este caso no solicita confirmacin. No se puede borrar una tabla que est siendo utilizada por otros usuarios En Standard Engine, borrar una base de datos implica borrar el transaction log file. En Standard Engine se remueve el subdirectorio que cre para la base de datos, a menos que el usuario hubiera agregado all archivos que no correspondan a la base.

CREATE TABLE Descripcin Esta sentencia se utiliza para crear una nueva tabla en la Base de Datos, especificando restricciones de integridad sobre las columnas, disear el tamao de los extents inicial y subsiguientes y especificar cmo ser el locking de esa tabla. Sintaxis SE CREATE [TEMP] TABLE Nombre-Tabla (Nombre-Columna Tipo-Dato [Clusula Default] [NOT NULL],... [Clusula CONSTRAINT]) [IN "pathname"] OL CREATE [TEMP] TABLE Nombre-Tabla (Nombre-Columna Tipo-Dato [Clusula Default] [NOT NULL],... [Clusula CONSTRAINT]) [IN Nombre-DBSpace] [EXTENT SIZE Primeros k bytes [NEXT SIZE Prximos k bytes]]

Los nombres de las tablas deben ser nicos dentro de la base de datos. En una base ANSI, la combinacin Propietario.Nombre-Tabla debe ser nico. Una tabla temporaria dura por la sesin de trabajo, y su nombre no puede coincidir con ninguna tabla, vista o sinnimo de la base de datos. Al menos una columna debe figurar al crear la tabla. En las tablas temporarias se puede especificar una clusula WITH NO LOG para indicar que no registre en el transaction log file las operaciones sobre esa tabla. Se puede indicar dnde crear la tabla: en el caso del Standard Engine, se puede indicar un path diferente del que est la base de datos; en OnLine, se puede indicar un dbspace diferente al que est la base de datos. Ms an, se puede especificar el tamao del primer extent y el de los siguientes (debe hacerse en pginas, con un mnimo de 4)

10

A nivel de las tablas se pueden definir constraints, para indicar que la columna tenga un valor por default, sean clave primaria, clave externa, o que los datos que se ingresen respondan a determinados chequeos. Para ello, se incluyen las formas generales de las diferentes clusulas: La forma general de una clusula Constraint es: [UNIQUE | PRIMARY KEY (Columna 1,...,Columna n)] [FOREIGN KEY (Columna 1,...,Columna n) REFERENCES Nombre-Tabla (Lista-Columnas)] [CHECK (Condicin)] CONSTRAINT Nombre_Restriccin] UNIQUE indica que no admita valores duplicados para esa columna. No es vlida sobre columnas de tipo BYTE o TEXT. PRIMARY KEY se utiliza para indicar que una columna o conjunto de columnas sean la clave primaria, por lo que no admitir valores nulos o duplicados. Slo una definicin de Primary Key es vlida por tabla. No es vlida sobre columnas de tipo BYTE o TEXT. FOREIGN KEY se utiliza para definir una columna o conjunto de columnas como una clave externa, para propsitos de establecer relaciones o joins con otras tablas, en las que deber haber una Primary Key para coincidir. Para eso se indica con la clusula REFERENCES la tabla con la cual se est estableciendo la relacin, y sobre qu columnas de la misma. Por lo tanto, las columnas referenciadas deben ser Primary Key o -al menos- no contener valores duplicados o nulos (si no, reporta un error). No es vlida sobre columnas de tipo BYTE o TEXT. CHECK permite establecer condiciones que deben cumplir los datos antes de insertar o actualizar una fila de la tabla. Se pueden establecer condiciones de comparacin, pero no utilizar subqueries, usar funciones agregadas, identificador de fila, variables del host ni funciones como USER, TODAY, etc. CONSTRAINT se utiliza para generarle un nombre al constraint, por el que podr ser luego invocado. La forma general de una clusula Default es: DEFAULT { [ literal | NULL | CURRENT [Opcin del tipo DateTime] | USER | TODAY | SITENAME | DBSERVERNAME] }

OL

Con ella se puede indicar un valor literal o nulo para una dada columna CURRENT es vlida para datos del tipo DateTime, y asigna el valor del instante de acuerdo a la precisin indicada. USER asigna un literal con el nombre del usuario TODAY asigna la fecha del da 11

SITENAME o DBSERVERNAME (son sinnimos) asigna el nombre del server.

12

ALTER TABLE Descripcin Esta sentencia se utiliza para insertar una columna en una tabla, borrar una columna de una tabla, modificar el tipo de dato de una columna, agregar, modificar o eliminar un constraint. Sintaxis SE ALTER TABLE { [Nombre-Tabla | Sinnimo] } { ADD (Nombre-Columna-Nueva Tipo-Dato [Clusula DEFAULT] [NOT NULL] [Clusula CONSTRAINT] [BEFORE Nombre-Columna-Existente][,...]) | DROP (Nombre-Columna-Vieja[,...] ) | MODIFY (Nombre-Col-Existente Tipo-Dato-Nuevo [Clusula DEFAULT] [NOT NULL] [Clusula CONSTRAINT] [, ...]) | ADD CONSTRAINT [Clusula CONSTRAINT] | DROP CONSTRAINT [(] Nombre-Constraint [,...)] } OL | MODIFY NEXT SIZE kbytes OL | LOCK MODE { ( PAGE | ROW ) } La forma de la clusula Default es como la descripta anteriormente En cuanto a la clusula Constraint, pesan algunas restricciones: no se puede definir una Foreign Key, ni se puede agregar un constraint sobre columnas que ya tengan datos; si se utiliza Unique, la tabla slo puede tener una fila. No se puede agregar una columna de tipo Serial a una tabla si ya tiene filas. La clusula Not Null se puede utilizar slo si la tabla est vaca. Al eliminarse una columna, se eliminan los ndices o constraints definidos sobre ella. Al modificar una columna, se eliminan las constraints definidas sobre ella. Si se desea que permanezca alguna caracterstica (como default, not null, etc.), se deben reespecificar en la clusula de modificacin. Se intenta la conversin de datos, aunque el xito de la misma depende de qu tipos de datos estn involucrados.

13

RENAME TABLE Descripcin Esta sentencia se utiliza para cambiar el nombre de una tabla Sintaxis RENAME TABLE [Propietario.]Nombre-Viejo TO Nombre-Nuevo Slo puede renombrar la tabla su propietario o aquel que tenga privilegio de DBA o de Alter sobre la tabla. No sirve consignar un nombre de Propietario para cambiarlo: produce un error. En SE no sirve incluir esta sentencia en una transaccin (no se vuelve atrs). DROP TABLE Descripcin Esta sentencia se utiliza para borrar una tabla, junto con sus datos Sintaxis DROP TABLE { Nombre-Tabla | Sinnimo } Slo puede eliminar la tabla su propietario o aquel que tenga privilegio de DBA. Al eliminar una tabla, se borran todos sus datos, ndices, constraints, sinnimos y vistas. En SE no sirve incluir esta sentencia en una transaccin (no se vuelve atrs).

14

Vistas Las vistas -views- son un nivel elevado de abstraccin de las bases de datos, que proveen al usuario de una ventana de los datos existentes. El usuario identifica una vista por un nombre, y la trata como a una tabla con algunas restricciones. Una vista puede contener columnas de ms de una tabla o valores resultantes de funciones sobre las columnas. Las vistas son ventanas dinmicas de la base de datos, marcando una diferencia sustancial con las tablas temporarias, que slo muestran el estado de la base de datos al momento que son creadas. Habitualmente se utilizan las vistas para limitar el acceso a datos importantes, para que los usuarios puedan consultar, actualizar, insertar o borrar datos en las tablas con las restricciones que correspondan. Las vistas pueden ser creadas o eliminadas en cualquier momento, y la informacin de control es mantenida en los catlogos de sistema sysviews y syscolumns. Las vistas pueden ser definidas en funcin de otras vistas. Cuando se elimina la vista origen, se eliminan todas las que dependen de ella. Las consultas a travs de una vista son tratadas como si fuesen sobre una tabla. A travs de las vistas se pueden hacer inserciones, actualizaciones y borrados de las tablas con las siguientes consideraciones: No se puede modificar la base de datos si la definicin de la vista incluye joins, clusula GROUP BY, DISTINCT o UNIQUE o funciones agregadas. Se puede construir un form sobre una vista si las columnas de la misma se refieren slo a una tabla. No se puede insertar filas a una tabla desde una vista con columnas virtuales, aunque s se puede borrar una fila bajo esas condiciones. No se pueden ejecutar ALTER TABLE, CREATE INDEX o UPDATE STATISTICS sobre una vista. Se dispone de los ndices existentes sobre las columnas en las tablas subyacentes. Si se inserta una fila desde una vista con solo algunas columnas de la tabla, las dems son completadas con NULL, salvo que esto no se permita. Si es as, no se puede insertar. Si se eliminan columnas de la tabla usadas en la definicin de una vista, la misma deja de ser til. Para evitar inserciones o actualizaciones de los datos que escapen a las restricciones de la definicin de la vista, es obligatorio crearla con la clausula WITH CHECK OPTION. 15

Hay que ser cuidadoso con las posibles filas duplicadas de una vista que se actualicen a una tabla con filas nicas. Privilegios en las Vistas Al crear una vista, se reciben los mismos privilegios que los detentados sobre la tabla subyacente. Si adems esta tabla se cre con la clusula WITH GRANT OPTION, se pueden pasar estos privilegios a otros usuarios. Si hay ms de una tabla en la construccin de la vista slo se dispone del privilegio SELECT. CREATE VIEW Descripcion Esta sentencia se utiliza para crear una nueva vista basada en tablas o vistas ya existentes Sintaxis CREATE VIEW Nombre-Vista [ (Lista-Columnas) ] AS SELECT-Sentencia [WITH CHECK OPTION] Una vista, como se indica ms arriba, puede ser usada como una tabla, salvo en las siguientes sentencias: Alter Index, Alter Table, Create Index, Create Table, Drop Index, Drop Table, Lock Table, Recover Table, Rename Table o Unlock Table. Se debe tener el privilegio de Select sobre todas las columnas implicadas en la definicin de una vista. Los tipos de datos de las columnas de la vista se deducen de las columnas que le dan origen. DROP VIEW Descripcin Esta sentencia se utiliza para borrar una vista de una Base de Datos Sintaxis DROP VIEW { Nombre-Vista | Sinnimo } Se debe ser el propietario de la vista o tener privilegio DBA. Tambin se eliminan las vistas definidas a partir de ella. En SE no sirve incluir esta sentencia en una transaccin (no se vuelve atrs). CREATE SYNONYM 16

Descripcin Esta sentencia se utiliza para propocionar un nombre alternativo a una tabla o a una vista. Sintaxis CREATE [PUBLIC | PRIVATE] SYNONYM Sinnimo FOR [Nombre-Tabla | Nombre_Vista] El modo default de creacin de un sinnimo es Public, por el cual se pone este sinnimo a disposicin de todos los usuarios. No se puede crear un sinnimo para un sinnimo. En SE no sirve incluir esta sentencia en una transaccin (no se vuelve atrs). En OL se puede crear un sinnimo para cualquier base de datos en el servidor de base de datos, de la forma Nombre_BD:Nombre_tabla. DROP SYNONYM Descripcin Esta sentencia se utiliza para remover un sinnimo previamente definido. Sintaxis DROP SYNONYM Sinnimo Se debe ser el propietario del sinmimo o tener privilegio DBA para eliminarlo. En SE no sirve incluir esta sentencia en una transaccin (no se vuelve atrs).

17

Estrategias de Indexacin Hay dos razones bsicas para crear un ndice sobre columnas de una tabla en una base de datos: Acelerar el ordenamiento de filas Optimizar la performance de los queries Contar con ndices adecuados proporciona significativos ahorros de tiempo en los queries que efectan los usuarios. Como contrapartida, las inserciones, borrados y modificaciones de datos se tornan mas lentas, pues los ndices deben ser actualizados convenientemente. As resulta apropiado crear un ndice slo cuando es necesario y eliminarlo cuando deja de serlo. Aunque esto es muy sencillo en este ambiente, conviene tener presentes algunas consideraciones estratgicas. Entonces al momento de indexar, valen las siguientes consideraciones: No tienen sentido ndices para tablas de menos de 200 filas. No indexar sobre columnas con pocos valores posibles -sexo, estado civil, etc.-. En todo caso, puede tener sentido un ndice clustered -lo veremos ms adelante-. Si la clusula WHERE de una sentencia SELECT impone condiciones sobre una columna, crear un ndice sobre la misma. Si la condicin es sobre varias columnas, conviene entonces un ndice compuesto sobre todas las columnas implicadas. Si la clausula WHERE de una sentencia SELECT tiene un join entre una columna simple de una tabla y una columna simple de otra tabla, crear un ndice sobre la columna de la tabla con mayor nmero de filas. Si varias columnas de una tabla tienen condiciones de join con varias columnas de otra tabla, crear un ndice compuesto sobre las columnas implicadas de la tabla con mayor nmero de filas. Para el uso de ciertos utilitarios -como DBLOAD o DBLINK- conviene eliminar previamente los ndices existentes y luego regenerarlos. Como comentario adicional, tener presente que, ante una sentencia SELECT que incluya un join entre 2 tablas sin un ndice sobre las columnas implicadas, RDSQL crea un ndice temporario por razones de optimizacin.

18

Estrategias de Indexacion-Indices Clustered Como la informacin es extrada del disco en bloques, en ciertos casos puede convenir que la misma est fsicamente agrupada en el disco para una ms ptima recuperacin. Para ello se cuenta con la posibilidad de indicar que un ndice sea clustered, a travs de la sentencia CREATE INDEX o la ALTER INDEX. Por ejemplo, en ciertas consultas segn el sexo o el estado civil, la existencia de un ndice de este tipo puede resultar en un trabajo ms eficiente del disco. CREATE INDEX Descripcin Esta sentencia se utiliza cuando se desea crear un ndice para una o ms columnas de una tabla. Sintaxis CREATE [UNIQUE|DISTINCT] [CLUSTER] INDEX Nombre-Indice ON {[Nombre-Tabla|Sinnimo]} (Nombre-Columna [ASC|DESC] ,...) Para crear un ndice, hace un lock exclusivo sobre la tabla. En SE no sirve incluir esta sentencia en una transaccin (no se vuelve atrs). En SE no se puede utilizar la opcin Cluster si la tabla tiene un audit trail file. Si se incluye ms de una columna, es tratado como una composicin de esos datos. En SE se pueden incluir hasta 8 columnas en la definicin de un ndice, siempre que no superen los 120 bytes. En OL se pueden incluir hasta 16 columnas en la definicin de un ndice, siempre que no superen los 255 bytes. La clusula Unique o Distinct previene la admisin de valores duplicados en esa columna.

19

ALTER INDEX Descripcin Esta sentencia se utiliza para organizar fsicamente las filas de una tabla en el orden de un ndice existente o para cancelar el atributo de clustering. Sintaxis ALTER INDEX Nombre-Indice TO [NOT] CLUSTER En SE no sirve incluir esta sentencia en una transaccin (no se vuelve atrs). En SE no se puede modificar un ndice a Cluster si la tabla tiene un audit trail file. Slo puede haber 1 ndice clustered por tabla. Para llevar un ndice a clustered, hace un lock exclusivo sobre la tabla. Adems, debe tener suficiente espacio en disco para mantener 2 copias de la tabla. Llevar un ndice a Not Cluster no implica reordenamiento fsico alguno. DROP INDEX Descripcin Esta sentencia se utiliza para borrar un ndice. Sintaxis DROP INDEX Nombre-Indice Se debe ser el propietario del ndice o tener privilegio DBA para eliminarlo. En SE no sirve incluir esta sentencia en una transaccin (no se vuelve atrs). El uso de esta instruccin no tiene efecto sobre las constraints. RENAME COLUMN Descripcin Esta sentencia se utiliza para cambiar el nombre de una columna Sintaxis RENAME COLUMN Tabla.Columna-Vieja TO Columna-Nueva Se debe ser el propietario de la tabla, tener privilegio DBA o privilegio ALTER sobre la tabla para cambiar el nombre de una columna. En SE no sirve incluir esta sentencia en una transaccin (no se vuelve atrs).

20

UPDATE STATISTICS Descripcin Esta sentencia se utiliza para actualizar los datos en los system catalogs que se utilizan para optimizar las estrategias de bsqueda y/o los stored procedures. Sintaxis UPDATE STATISTICS [FOR {Nombre-Tabla|Sinnimo}] [FOR PROCEDURE [Nombre_Procedure]] Si no se especifica tabla, la informacin de todas las tablas es actualizada. Si no se especifica procedure, la informacin de todos los procedures es actualizada. Conviene utilizarla cuando se han hecho modificaciones intensivas sobre una tabla. La optimizacin de procedures es til para mejorar la performance de la ejecucin.

21

Lenguaje de Manejo de Datos - DML


En el DML se incluyen las sentencias que nos permiten consultar, insertar, modificar y/o eliminar informacin de las tablas de una base de datos. SELECT Descripcin Esta sentencia se utiliza para consultar la Base de Datos activa. Se compone de las 7 siguientes clusulas, de las cuales nicamente son obligatorias SELECT y FROM Sintaxis SELECT <Clusula-Select> FROM <Clusula-From> [ WHERE Condicin ] [ GROUP BY Lista-Columnas ] [ HAVING Condicin ] [ ORDER BY Nombre-Columnas [ASC|DESC] [,...] [ INTO TEMP Nombre-Tabla [WITH NO LOG]] Brevemente, la Clusula SELECT nombra un conjunto de columnas o expresiones a ser recuperadas, la Clusula FROM nombra una lista de tablas, la Clusula WHERE establece condiciones sobre las filas, la Clusula GROUP BY agrupa filas, la Clusula HAVING establece condiciones sobre los grupos, la Clusula ORDER BY ordena las filas seleccionadas y la Clusula INTO TEMP pone los resultados en una tabla temporaria. Si se ejecuta una sentencia Select sobre ms de una tabla, el resultado es equivalente a la creacin de una nueva tabla con el producto cartesiano de todas las tablas consignadas, adecuadamente filtradas por las condiciones estipuladas en la clusula Where. Para nombrar una tabla, es obligatorio hacerlo con el nombre del propietario como prefijo si la base est en modo ANSI, y opcional si no lo est. <Clusula-Select> SELECT [ALL | DISTINCT | UNIQUE] Lista-Select Indica qu retorna la sentencia, pudiendo ser columnas, expresiones o constantes. La clusula ALL (valor por default) indica que se incluyan todas las filas en la respuesta, sin eliminar las duplicadas. Para evitar esto, se dispone de la clusula DISTINCT o UNIQUE. Para elegir todas las columnas de una tabla, se puede usar el * 22

Se puede dar un display label para cada columna, que aparecer como el encabezamiento en la salida del Select, o como los nombres de las columnas de una tabla temporaria. Si se especifica una columna y una funcin agregada, la columna debe ser incluida en la clusula GROUP BY.

<Clusula-From> FROM [OUTER] Nombre-Tabla [Alias-Tabla] [,...][,...] Indica de qu tablas se saca la informacin para esta sentencia. Se puede especificar un alias para cada tabla, por el cual puede posteriormente ser denominada. Ms an, en caso de los auto-join es necesario hacerlo. OUTER permite hacer un outer join, que se explica brevemente a continuacin Outer Joins Un outer join entre 2 tablas las trata asimtricamente. Una de las tablas es la dominante y la otra es la sirviente. Si esta ltima no tiene filas que satisfagan la condicin de join, en la respuesta habr una fila con valores nulos acompaando a la fila de la tabla dominante que no tenga proyeccin. Por ejemplo, si tenemos las columnas zona de la tabla t1 y region de la tabla t2 con los siguientes valores: t1.zona 2 7 9 t2.region 1 2 3 7

y ejecutamos la siguiente sentencia Select: Select zona, region from t1, outer t2 where zona = region

23

obtenemos como respuesta: zona 2 7 9 region 2 7 null

Para un outer join, siempre debe haber una clusula Where. Clusula WHERE Se utiliza para especificar criterios de bsqueda y condiciones de join sobre los datos que se quiere seleccionar. WHERE Condicin Las formas posibles de Condicin son: Condiciones de Comparacin Condiciones de join Condicion con Subqueries Condiciones de Comparacin En todos los casos, expr se refiere a un nombre de columna, una constante o cualquier combinacin de stos conectados por los operadores aritmticos +, -, *, /, siempre que sea una operacin que tenga sentido. Se pueden utilizar tambin 3 funciones que actan como una constante; ellas son USER (que devuelve el nombre del usuario actual), TODAY (devuelve la fecha del sistema) o CURRENT (devuelve la fecha y hora del sistema). En la expr se pueden utilizar tambin las funciones agregadas -no combinadas con columnas- o de fecha. Se ven ms adelante.

24

expr op-rel expr Un operador relacional es alguno de los siguientes: =, != o <>, >, >=, <, <=. expr [NOT] BETWEEN expr AND expr Para determinar si una expresin est dentro de un rango de valores. Se aplica a expresiones numricas o de fechas. expr [NOT] IN (listaval) Para determinar si una expresin se encuentra en una lista dada de valores. nombrecol [NOT] LIKE "string" Para comparar columnas caracteres con un dado pattern. Valen los wildcards: % indica 0 o ms caracteres, y _ indica cualquier caracter en esa posicin. nombre-col [NOT] MATCHES "string" Para comparar columnas caracteres con un dado pattern. Valen los wildcards: * indica 0 o ms caracteres, ? indica cualquier caracter en esa posicin, [...] compara con cualesquiera de los caracteres encerrados, incluyendo rangos (a-z). Si el primer caracter es un ^, equivale a negarlos, y la / es el caracter de escape. nombre-col IS [NOT] NULL Para determinar si una columna es nula. Condiciones de join Se hace un join de dos o ms tablas cuando son consignadas en la clusula FROM y se establece una relacin en la clusula WHERE entre al menos una columna de cada tabla. El resultado de un join es el producto cartesiano entre las tablas, de modo tal que cada par de filas de la tabla compuesta resultante satisface la condicion del join. Puede hacerse un auto-join de una tabla, siempre que se utilicen 2 alias diferentes en la seccin FROM. Puede haber un outer join cuando cada fila de la tabla 1 es includa en el resultado, aunque no se cumpla la condicin, en cuyo caso se completa con NULL.

25

Condicin con Subqueries Una condicin de bsqueda en una sentencia SELECT puede: Comparar una expresin con el resultado de otra sentencia SELECT: WHERE expr op-rel { ALL | [ANY | SOME] } (sent. SELECT) ALL se usa para tratar la comparacin con todas las filas que retorne la sentencia SELECT interior. ANY o SOME se usa para tratar la comparacin con cualquier fila retornada por la sentencia SELECT interior. Determinar si una expresin est incluida en el resultado de otra sentencia SELECT: WHERE expr [NOT] IN (sent. SELECT) Preguntar si existen filas seleccionadas por otra sentencia SELECT: WHERE [NOT] EXISTS (sent. SELECT) En todos los casos, en la sentencia SELECT interior slo puede utilizarse una expresin en su lista de seleccin y no puede tener una clusula ORDER BY. Clusula GROUP BY GROUP BY Lista_columnas Se utiliza para obtener una respuesta de una fila por cada grupo de filas que satisface la condicin del Where, con un valor para cada una de las columnas que conforman el grupo. Al usar esta clusula, toda columna que figure en la lista de seleccin impone que tambin aparezca conformando el grupo. En lugar del nombre de las columnas, se puede incluir el nmero que indica su orden de aparicin en la lista de seleccin. Se puede agrupar hasta 8 columnas.

26

Clusula HAVING HAVING Condicin Se utiliza para aplicar condiciones de clasificacin a los grupos. Complementa la clusula Where. Si no se us la clusula GROUP BY, se asume todo como un solo grupo. Clusula ORDER BY ORDER BY Nombre-Columna [ASC|DESC] [,...] Se utiliza para ordenar los resultados de la seleccin por los valores contenidos en una o ms columnas, que deben figurar en la lista de seleccin. En lugar del nombre de las columnas, se puede incluir el nmero que indica su orden de aparicin en la lista de seleccin. Clusula INTO TEMP INTO TEMP Nombre-Tabla [WITH NO LOG] Se utiliza para crear una tabla temporaria con los resultados de la seleccin. La opcin WITH NO LOG es soportada en el modo ANSI, y tiene efecto slo si la base tiene transaction log file. Operador UNION Se pueden unir dos o ms sentencias SELECT mediante el operador UNION: Sentencia-SELECT UNION [ALL] Sentencia SELECT [UNION ... ] El nmero de tem de la lista de seleccin de cada select debe ser igual, y los tipos de datos corresponderse uno a uno. Slo se puede usar una clusula ORDER BY en la ltima sentencia Select. Slo se puede usar una clusula INTO TEMP en la ltima sentencia Select. No se puede utilizar en un subquery o en la definicin de una vista.

27

Funciones Agregadas Se dispone de ciertas funciones que agregan cierta informacin sobre las filas seleccionadas por la clusula WHERE. Ellas son: COUNT(*) Retorna el nmero de filas COUNT(DISTINCT x) Retorna el nmero de filas en las que la columna x tiene valores distintos SUM([ALL| Retorna la suma de los valores de la columna x DISTINCT] x ) AVG([ALL| Retorna el promedio de los valores de la columna x DISTINCT] x ) MAX([ALL| Retorna el maximo de la columna x DISTINCT] x) MIN([ALL| Retorna el minimo de la columna x DISTINCT] x) Funciones adicionales para la lista de seleccin DATE (expr) DAY (expr_fecha) LENGTH (string) MDY(exp1,exp2,exp3) Retorna un valor de tipo DATE de la expr consignada Retorna el da de una expresin de fecha Retorna el nmero de bytes del string o columna. Retorna un tipo DATE donde exp1 es el mes, exp2 el da y exp3 el ao. MONTH(expr_fecha) Retorna el mes de una expresin de fecha WEEKDAY Retorna un entero que indica el da de la semana, donde 0 es (exp1,exp2,exp3) domingo y 6 el sbado. YEAR (expr_fecha) Retorna el ao de una expresin de fecha CURRENT prim TO Devuelve un dato de tipo DATETIME con el valor actual en ult el rango indicado. EXTEND (valor[,prim Ajusta la precisin de un dato DATETIME TO ult])

28

INSERT Descripcin Esta sentencia se utiliza para insertar una o ms filas nuevas en una tabla ya existente Sintaxis INSERT INTO Nombre-Tabla [( Lista-Columnas)] { VALUES (Lista-Valores)| SELECT -<Sentencia-Select> } Los datos se insertan en las columnas en el orden especificado. Si no se consignan los nombres de las columnas, se inserta un valor en cada columna, en el orden de su definicin. Si se inserta con una sentencia Select, los datos deben extraerse de otras tablas, y no se puede usar la clusula INTO TEMP en la Select. Al insertar, intenta convertir datos. Para una columna de tipo Serial, ponga un 0 para que se encargue el SQL de generar el nmero correspondiente. Si se insertan valores, no pueden ser repetidos. Todas las filas implicadas en una insercin son locked durante su ejecucin. Si el nmero de filas superara el mximo de locks simultneos, o bien se reduce la insercin o se hace un lock sobre toda la tabla. UPDATE Descripcin Esta sentencia se utiliza para modificar los valores de una o ms columnas en una o ms filas de la tabla. Sintaxis UPDATE Nombre-Tabla SET {Nombre-Columna = Expr [,...] | {(Lista-Columnas) | *}= (Lista-Expr)} [WHERE Condicin] Si se modifica con una sentencia Select, los datos deben extraerse de otras tablas, y no se puede usar la clusula UNIQUE en la Select. Al insertar, intenta convertir datos. Todas las filas implicadas en una actualizacin son locked durante su ejecucin. Si el nmero de filas superara el mximo de locks simultneos, o bien se reduce la actualizacin o se hace un lock sobre toda la tabla.

29

DELETE Descripcin Esta sentencia se utiliza para borrar una o ms filas de una tabla Sintaxis DELETE FROM Nombre-Tabla [WHERE Condicin] Todas las filas implicadas en un borrado son locked durante su ejecucin. Si el nmero de filas superara el mximo de locks simultneos, o bien se reduce el borrado o se hace un lock sobre toda la tabla.

30

Acceso a los Datos


Para evitar situaciones de conflicto entre ms de un usuario al acceder a los datos, se cuenta con diferentes niveles de locking, que proporciona un adecuado nivel de control de concurrencia. En SQL hay dos niveles de locking: A nivel de Tabla (o de archivo) A nivel de Fila o de registro Locks a nivel de Tabla Si se utiliza de este modo, los dems usuarios pierden toda posibilidad de modificar o an ver cualquier fila de esa tabla, dependiendo del modo en el que se hizo el lock. Si se efectu en modo SHARE, los dems usuarios podrn seleccionar datos de esa tabla, pero si se hizo en modo EXCLUSIVE no podrn insertar, borrar o actualizar filas de la tabla. El usuario deber entonces ser muy cuidadoso con los locks en este nivel, y reservarlos para los casos en que resulten necesarios por las caractersticas de las operaciones a ejecutar (demasiadas filas involucradas, operaciones que afecten a to 1da la tabla, etc.) Locks a nivel Fila Previsto para operaciones que involucren slo algunas filas, hay dos posibilidades: a) Locks de una fila individual El SQL hace un lock automtico de una fila cuando la misma es invocada en una sentencia UPDATE o se trabaja en modo Update desde el men. b) Locks de un grupo de filas Se utiliza para tratar un conjunto de operaciones como una transaccin, lo que adems inhibe a los dems usuarios de acceder a esas filas mientras dura dicha transaccin. Para ello se dispone de las sentencias BEGIN WORK y COMMIT WORK para abarcar el conjunto de operaciones. Todas las filas involucradas en las operaciones que all se efectan permanecen locked para los dems usuarios. Tambin las sentencias de actualizacin de datos que involucran mltiples filas implican locks sobre las mismas. Cuando un usuario intenta una operacin sobre filas en una tabla que fue locked en modo EXCLUSIVE, el SQL retorna un error. Para evitarlo, el usuario
1

31

puede usar la sentencia SET LOCK MODE TO WAIT, con lo que el SQL lo retendr en espera hasta que las filas sean liberadas. LOCK TABLE Descripcin Esta sentencia se utiliza para prohibir el acceso de otros usuarios a una determinada tabla. Sintaxis LOCK TABLE Nombre-Tabla IN {SHARE | EXCLUSIVE} MODE Slo un lock por vez es admitido sobre una tabla. Si se trabaja con transacciones, la sentencia COMMIT WORK cancela todos los locks pendientes sobre la tabla. UNLOCK TABLE Descripcin Esta sentencia se utiliza para liberar el acceso por otros usuarios a una determinada tabla previamente denegado mediante una sentencia Lock Table. Sintaxis UNLOCK TABLE Nombre-Tabla No se puede utilizar esta sentencia dentro de una transaccin.

32

SET LOCK MODE Descripcin Esta sentencia se utiliza para determinar si las subsiguientes llamadas al RDSQL esperan a que se libere una fila que en ese momento pudiera estar bloqueada Sintaxis SET LOCK MODE TO [NOT] WAIT El modo default es NOT WAIT. En este caso, un intento de acceso a una fila bloqueada por otro proceso produce un cdigo de error. El modo WAIT produce que, al invocar una fila que est locked, se espera por su liberacin. Aqu puede suceder que, si la fila no es liberada por problemas en el otro proceso, no se salga de esta situacin. GRANT Descripcin Esta sentencia se utiliza para especificar privilegios de acceso de los diversos usuarios a la Base de Datos o a las tablas o vistas de la misma. Sintaxis GRANT Privil-Base-De-Datos TO {PUBLIC | Lista-Usuarios} GRANT Privil-Tabla ON {Nombre-Tabla | Nombre-Vista | Sinnimo} TO {PUBLIC | Lista-Usuarios} [WITH GRANT OPTION] [AS dador] GRANT EXECUTE ON Nombre-Procedure TO {PUBLIC | Lista-Usuarios} [WITH GRANT OPTION] [AS dador] Privil-Base-De-Datos: Uno de los siguientes tipos de acceso de nivel a la Base de Datos: CONNECT RESOURCE DBA Permite que el Usuario acceda a la Base de Datos pero no permite crear tablas e ndices permanentes. Permite que el Usuario acceda a las tablas de la Base de Datos y tambin crear tablas e ndices permanentes. Permite al Usuario la administracin de privilegios sobre la Base de Datos completa. 33

Privil-Tab: Uno o ms de los siguientes tipos de acceso de nivel a la tabla (privilegios mltiples deben separarse con comas): ALTER Inserta o borra columnas o modifica tipos de datos de columnas. DELETE Borra filas INDEX Crea ndices INSERT Inserta filas SELECT[Cols] Recupera datos de columnas especificadas UPDATE[Cols] Modifica valores en columnas especificadas REFERENCES[Cols] Refencia columnas en constraints, siempre que tenga el privilegio Resource. ALL[PRIVILEGES] Todos los mencionados anteriormente Cuando se utiliza la clusula WITH GRANT OPTION le da al Usuario la posibilidad de asignar privilegios a otros usuarios. As, no puede evitar que se diseminen los privilegios. De todos modos, esto se corta revocando el privilegio al usuario originalmente invocado. Con la clusula AS dador, Ud. consignara otro usuario como quien otorga los privilegios, con lo cual puede romper la cadena de pasaje de privilegios. La clusula EXECUTE ON permite pasar a otro usuario la posibilidad de ejecutar un determinado stored procedure.

REVOKE Descripcin Esta sentencia remueve los privilegios de acceso de usuario para una tabla, una base de datos o un procedure. Sintaxis REVOKE Privil-Base-De-Datos FROM {PUBLIC | Lista-Usuarios} REVOKE Privil-Tabla ON {Nombre-Tabla | Nombre-Vista | Sinnimo} FROM {PUBLIC | Lista-Usuarios} REVOKE EXECUTE ON Procedure FROM {PUBLIC | Lista-Usuarios} Los Privilegios de Base de Datos y de Tablas son los mismos que en la sentencia anterior 34

Integridad de los Datos


La integridad de los datos es provista por dos medios: los audit trails y las transacciones Transacciones Las transacciones son un conjunto de operaciones que deben ser tratadas como una unidad de trabajo. Para su implementacin debe contarse con un archivo de auditora de la actividad en la base de datos (el transaction-log file), que puede ser generado al momento de crear la base de datos (con la clusula WITH LOG IN) o en cualquier momento con la sentencia START DATABASE. Para indicar el inicio de una transaccin, se utiliza la sentencia BEGIN WORK. De all en ms, todas las filas involucradas permanecen locked para los dems usuarios. El fin de una transaccin se indica con la sentencia COMMIT WORK, que produce la liberacin de todas las filas que estaban locked y acta como una confirmacin de todas las operaciones. Si el usuario detecta un error que invalide las operaciones efectuadas dentro de una transaccin, puede cancelarlas con la sentencia ROLLBACK WORK. Esto produce la vuelta de la base de datos al estado en que estaba al momento previo del inicio de la transaccin y la liberacin de las filas que estaban locked. De todos modos hay operaciones que no pueden ser canceladas como las de definicin de datos o las de ceder o revocar permisos. Hay un lmite para el nmero de locks simultneos por lo que una transaccin muy grande puede ocasionar problemas con lo cual ser necesario dividirla en dos transacciones o hacer LOCK TABLE. Como el archivo de auditora crece muy rpidamente es necesario inicializarlo peridicamente -mediante START DATABASE- despus de haber hecho un back-up de la base de datos. En caso de problemas externos se puede recuperar la base de datos con el uso de la sentencia ROLLFORWARD DATABASE: se carga la copia de back-up de la base de datos y, con el archivo de transacciones existente desde el momento en que se hizo dicho backup, se recupera la base de datos. 35

Audit Trails Un audit trail es un archivo que registra todos los cambios producidos en una tabla de una base de datos. Para iniciar un audit trail se usa la sentencia CREATE AUDIT. Puede hacerse en cualquier momento, y produce que todas las operaciones que a continuacin se hagan sobre la tabla sean registradas en l. Para eliminar un audit trail se usa la sentencia DROP AUDIT. Si hay un problema con una tabla que deba ser recuperada, el usuario puede hacerlo mediante la sentencia RECOVER TABLE, una vez que levant la copia de back-up y siempre que hubiera creado el audit trail justo antes de hacer el back-up. Los audit trails no son muy utilizados por los incovenientes que traen aparejados: Decrementan la performance del sistema. Inciden en el nmero mximo de tablas abiertas simultneamente. No proveen proteccin contra operaciones que involucran ms de una tabla. CREATE AUDIT Descripcin Esta sentencia se utiliza para crear un archivo de seguimiento de auditora y comenzar las registraciones en el mismo. Sintaxis SE CREATE AUDIT FOR {Nombre-Tabla | Sinnimo} IN "pathname" Se requiere tener el privilegio DBA o ser el propietario para usar esta sentencia. En OL no est disponible, aunque est provisto por medio de los logs files. DROP AUDIT Descripcin Esta sentencia se utiliza para borrar un archivo de seguimiento de auditora. Sintaxis SE DROP AUDIT FOR {Nombre-Tabla | Sinnimo} Se requiere tener el privilegio DBA o ser el propietario para usar esta sentencia. 36

RECOVER TABLE Descripcin Esta sentencia se utiliza cuando ocurre una falla en el Sistema. Permite recuperar una tabla de Base de Datos desde una copia backup y un archivo auditora Sintaxis SE RECOVER TABLE Nombre-Tabla Se requiere tener el privilegio DBA o ser el propietario para usar esta sentencia. BEGIN WORK Descripcin Esta sentencia se utiliza para comenzar una transaccin. Sintaxis BEGIN WORK Cada fila afectada por una sentencia UPDATE, DELETE o INSERT durante una transaccin es locked mientras no se cierra dicha transaccin. En las bases de datos ANSI no es necesaria esta sentencia, pues las transacciones son implcitas. COMMIT WORK Descripcin Esta sentencia se utiliza para efectivizar todas las modificaciones hechas a la base de datos desde la ltima sentencia BEGIN WORK. Sintaxis COMMIT WORK Esta sentencia libera todas las filas y/o tablas involucradas en la transaccin.

37

ROLLBACK WORK Descripcin Esta sentencia se utiliza para cancelar todas las modificaciones hechas a la base de datos desde la ltima sentencia BEGIN WORK, dejando la base de datos en el estado previo al comienzo de la transaccin. Sintaxis ROLLBACK WORK Esta sentencia libera todas las filas y/o tablas involucradas en la transaccin. En SE no se deshacen aquellas sentencias que, an comprendidas en una transaccin, afecten la definicin de las tablas o columnas, permisos, etc. START DATABASE Descripcin Esta sentencia se utiliza para trabajar con un nuevo archivo de transaction log Sintaxis SE START DATABASE Nombre-Base-De-Datos WITH LOG IN "pathname" [MODE ANSI] En un server con SE se puede usar esta sentencia siempre que se tenga privilegio DBA, no haya base de datos activa y que los directorios especificados en pathname existan. Al ejecutar esta sentencia, la base de datos queda locked en modo exclusivo; hay que hacer un Close Database para liberarla.

38

ROLLFORWARD DATABASE Descripcin Esta sentencia se utiliza para aplicar las transacciones registradas en el archivo de transaction-log a una copia de backup de la base de datos para recuperar todas las transacciones que estn completas. Sintaxis SE ROLLFORWARD DATABASE Nombre-Base-De-Datos Para recuperar una base de datos bajo SE se necesitan tanto la copia de la base de datos como el transaction log file iniciado inmediatamente despus que se hizo ese backup. Se debe tener el privilegio DBA para hacerlo, y la base de datos debe estar previamente cerrada. Al ejecutar esta sentencia, la base de datos queda locked en modo exclusivo; hay que hacer un Close Database para liberarla.

39

Sentencias Auxiliares
CHECK TABLE Descripcin Esta sentencia se utiliza para comparar una tabla con sus ndices para determinar si coinciden. Se utiliza cuando se supone que los datos o los ndices se han corrompido por alguna razn, tpicamente una terminacin anormal. Sintaxis SE CHECK TABLE Nombre-Tabla Se debe contar con el privilegio DBA o ser el propietario para usar esta sentencia. Esta sentencia utiliza un utilitario del SE, el bcheck, que puede ser invocado desde el prompt. REPAIR TABLE Descripcin Esta sentencia se utiliza para borrar y regenerar los ndices de una tabla previamente chequeada con la sentencia CHECK TABLE. Sintaxis REPAIR TABLE Nombre-Tabla Se debe contar con el privilegio DBA o ser el propietario para usar esta sentencia. Esta sentencia utiliza un utilitario del SE, el bcheck, que puede ser invocado desde el prompt.

40

LOAD Descripcin Esta sentencia se utiliza para cargar datos desde un archivo ASCII a una tabla, sinnimo o vista de una Base de Datos existente. Sintaxis LOAD FROM Path-Name [DELIMITER caracter ] INSERT INTO {Nombre-Tabla | Sinnimo | Nombre-Vista} [(Nombre-Columna[,...])] Se debe tener el privilegio de INSERT sobre la tabla para usar esta sentencia. Si se est trabajando con transacciones, se debe ejecutar una sentencia BEGIN WORK antes de la Load. Esta sentencia agrega filas a la tabla, por lo que se puede producir error si se trata de insertar filas con claves duplicadas cuando no est permitido. El delimitador por default es la |, salvo que hubiera otro caracter especificado en la variable DBDELIMITER. El backslas (/) se usa como carcter de escape, por lo que no hay que usarlo como delimitador. UNLOAD Descripcin Esta sentencia se utiliza para grabar datos de una tabla de una base de datos a un archivo ASCII Sintaxis UNLOAD TO Archivo [DELIMITER caracter ] <Sentencia Select> Se debe contar con el privilegio de SELECT sobre todas las columnas implicadas en la sentencia SELECT. El delimitador por default es la |, salvo que hubiera otro caracter especificado en la variable DBDELIMITER.

41

INFO Descripcin Esta sentencia se utiliza para mostrar algunas de las siguientes informaciones posibles: Nombres de tablas en la base de datos actual Columnas de una tabla Indices para una tabla Privilegios de acceso para una tabla Privilegios de referencias para las columnas de una tabla Estado de una tabla Sintaxis INFO {TABLES

| COLUMNS FOR Nombre-Tabla | INDEXES FOR Nombre-Tabla | [ACCESS | PRIVILEGES] FOR Nombre-Tabla | REFERENCES FOR Nombre-Tabla | STATUS FOR Nombre-Tabla}

OUTPUT Descripcin Esta sentencia se utiliza para escribir los resultados de un query a un archivo , mediante un pipe, enviarlo a otro programa. Sintaxis OUTPUT TO { Nombre-Archivo | PIPE Programa } [WITHOUT HEADINGS] <Sentencia-Select>

42

FORMS
Un FORM se especifica mediante un archivo con el layout de la pantalla y las instrucciones que indican cmo mostrar y/o ingresar los datos. Puede tener varias pginas de longitud y contener columnas de varias tablas. Estructura Un FORM consta de cuatro secciones que deben estar presentes (DATABASE, SCREEN, TABLES y ATTRIBUTES) y una seccin opcional (INSTRUCTIONS). A continuacin analizaremos cada una de las secciones. Seccin DATABASE DATABASE nombre-base-de-datos [WITHOUT NULL INPUT] Especifica la base de datos que se utilizar para trabajar con el FORM. Es la primera seccin que debe estar presente. without null input se utiliza cuando una base de datos no admite nulos. Muestra 0 para los campos numricos y espacios para los caracteres. Seccin SCREEN SCREEN { .... display field layout de la pantalla ... } Puede haber varias pantallas definidas en esta seccin con un mximo de 20 lneas para cada una. Si son ms, son automticamente divididas en dos. La forma de los display field es la siguiente: texto [fieldtag] texto es lo que se muestra en la pantalla. [] son los delimitadores del campo. El ancho del campo lo marcan la cantidad de espacios entre los delimitadores. field-tag es la identificacin del campo. Cada campo debe tener uno, y nada tienen que ver con las columnas de las tablas. 43

Las maysculas y minsculas son indistintas. Para mostrar ms de un campo se utiliza la barra |, de la forma nombre [tag1 |tag2 ]

Si esto se utiliza debe incluirse la sentencia DELIMITERS en la seccin INSTRUCTIONS. Seccin TABLES TABLES nombre-tabla[ nombre-tabla] Especifica las tablas de las cuales se invocarn columnas en el FORM. No se puede incluir una tabla temporaria y pueden ser de una vista si en la definicin de la misma solo participa una tabla y no tenga datos agregados. Seccin ATTRIBUTES field-tag = field-descripcion; Esta es la forma general de definir cada uno de los field-tag que aparecen en la seccin SCREEN. En esta seccin se indica cmo se muestra un campo, se especifica un valor default, se indica el rango de valores, etc. El orden en que aparecen los field-tag determina el movimiento del cursor. Los campos pueden estar asociados a columnas de las tablas o no, variando la forma de field-descripcion, como veremos ahora. Modo de definir campos ligados a columnas de tablas field-tag [tabla.]columna[,attr-list]; El field-tag se corresponde con uno de la seccin SCREEN. tabla indica la tabla a la que pertenece la columna. Es necesaria cuando ese nombre de columna se repite. attr-list es la lista de atributos, separados por ,. Los campos ligados a columnas de tablas pueden permitir ingreso de datos o no. Si no lo hacen, se denominan lookup fields.

44

Modo de definir campos display-only field-tag = DISPLAYONLY [ALLOWING INPUT] TYPE tipo-datos [NOT NULL][,attr-list]; DISPLAYONLY indica que es un campo no ligado a una columna. ALLOWING INPUT se usan para indicar que permite ingreso de datos. tipo-datos es uno de los tipos posibles excepto SERIAL. Columnas de join A travs de un FORM se pueden establecer joins de dos o ms columnas del mismo tipo, lo que redunda en mejor performance de los queries. La forma genrica de expresarlo es: field-tag = tabla1.columna [,attr-list1] = tabla2.columna[attrlist2] El orden en que aparecen los atributos determina el modo en el que actan. Tambin se pueden hacer los verify join para verificar que el valor ingresado a un campo que corresponde a una columna de una tabla ya existe en la columna de la otra tabla (la dominante). Este join se denota con un * antes de la columna dominante. Esto es: field-tag = col1 = *col2 Veamos ahora los posibles atributos de attr-list AUTONEXT COLOR=id-color COMMENTS ="mensaje" DEFAULT=valor DOWNSHIFT FORMAT= "format-string" INCLUDE=(listavalores) field-tag=tabla1.col, LOOKUP [field-tag1=tabla2.col1 [field-tag2= tabla2.col2,...]] JOINING [*]tabla2.col Avanza el cursor al prximo campo cuando se completa el actual Permite mostrar el campo en alguno de los colores posibles Para mostrar mensaje en la lnea de comentarios al pie de la pantalla cuando el cursor pasa por el campo Asigna valor como default para ese campo Para campos CHAR. Convierte las maysculas a minsculas Permite controlar el modo de presentacin de datos de tipo numrico o fecha lista-valores es un conjunto de valores -separados por ,- o un rango -val1 TO val2- que indica los posibles valores vlidos para el campo Permite mostrar datos de otra tabla mientras ingresa datos de la tablaactiva pudiendo establecer un verify join

45

Impide la entrada de datos durante una operacin de ADD de nuevas filas NOUPDATE Impide la entrada de datos durante una operacin de UPDATE de filas PICTURE="pic-string" Especifica un patrn para el ingreso de datos CHAR QUERYCLEAR Limpia un campo de join en la pantalla cuando se ingresa a un query REQUIRED Fuerza el ingreso de datos en ese campo durante una operacin ADD REVERSE Muestra el campo en video reversa RIGHT Justifica a derecha el ingreso de los campos UPSHIFT Convierte en el ingreso de datos CHAR las minsculas a maysculas VERIFY Provoca que el usuario ingrese 2 veces el dato para ese campo ZEROFILL Justifica a derecha y rellena con 0 a izquierda los campos numricos Seccion INSTRUCTIONS INSTRUCTIONS [composites sentencia] [delimiters sentencia] [master sentencia] [bloques de control] END Esta seccin es opcional, y permite establecer joins compuestos, delimitadores de campo alternativos, crear relaciones maestro/detalle y/odefinir bloques de control. Veamos las distintas posibilidades: COMPOSITES <tabla1.col1,tabla1.col2[,tabla1.col3[, ... ]]> [*]<tabla2.col1,tabla2.col2[,tabla2.col3[, ...]]> Establece un join compuesto entre dos tablas y se usa cuando se deben especificar los valores de ms de una columna en una tabla para identificar unvocamente a una fila. DELIMITERS "ab" Cambia los delimitadores default ([ ]) a los caracteres a y b respectivamente. tabla1 MASTER OF tabla2 Establece que tabla1 es una tabla maestra mientras tabla2 es una tabla de detalle, simplificando los queries cruzados. 46

NOENTRY

Bloques de Control Mediante el conjunto de instrucciones disponibles en este punto, se puede controlar el movimiento del cursor ante operaciones ADD o UPDATE, chequear datos ingresados, modificar datos despus de operaciones, efectuar clculos y guardar los resultados en otro campo, mostrar informacin agregada, llamar a funciones en C. Cada bloque de control es un bloque BEFORE o AFTER como veremos. {BEFORE | AFTER} lista-opciones OF tabla/lista-columnas accin ... accin Indica que se ejecute el conjunto de acciones antes o despus de que se ejecute una operacin. lista-opciones puede ser alguna de las siguientes: EDITADD, EDITUPDATE, ADD, UPDATE, QUERY REMOVE o DISPLAY. accin puede ser alguna de las siguientes: ABORT, LET, NEXTFIELD, COMMENTS o IF-THEN-ELSE.

47

Reports
Un REPORT se especifica mediante un archivo con las instrucciones que especifiquen los datos que contendr y el modo en que aparecern impresos. Estructura Un REPORT consta de tres secciones que deben estar presentes (DATABASE, SELECT y FORMAT) y tres secciones opcionales (DEFINE, INPUT y OUTPUT). A continuacin analizaremos cada una de las secciones. Seccin DATABASE DATABASE Nombre-Base-de-Datos END Especifica la base de datos que se utilizar como la base para el reporte. Es la primera seccin que debe estar presente. Seccin DEFINE DEFINE PARAM sentencias VARIABLE sentencias END Si est presente, en esta seccin se declaran las variables usadas en el REPORT y los parmetros que puede recibir desde la lnea de comandos. La sintaxis de ambas es: PARAM [num-arg] nombre-variable tipo-de-dato num-arg: es la posicin del argumento en la lnea de comandos. VARIABLE nombre-variable tipo-de-dato Se pueden definir hasta 100 variables entre ambos. Si se va a utilizar una de las variables definidas en esta seccin en la seccin SELECT, debe estar precedida con un signo $.

48

Seccin INPUT INPUT PROMPT FOR sentencias END Si est presente, esta seccin permite al usuario interactuar durante la emisin del REPORT permitiendo el ingreso de datos. PROMPT FOR nombre-variable USING "string" "string": es el mensaje que le aparece al usuario. Debe ir entre comillas. Puede haber ms de una sentencia PROMPT FOR en esta seccin. Seccin OUTPUT OUTPUT REPORT TO {PRINTER | "nombre-archivo"} LEFT MARGIN integer RIGHT MARGIN integer TOP MARGIN integer BOTTOM MARGIN integer PAGE LENGTH integer END Si est presente, esta seccin permite controlar los mrgenes derecho, izquierdo, superior e inferior, el largo de pgina y el dispositivo de salida. Los valores default son: Margen Izquierdo= 5 Margen Derecho= 132 Margen Superior= 3 Margen Inferior= 3 Longitud de Pgina= 66

49

Seccin SELECT select sentencia; .... select sentencia; end Esta seccin debe estar presente. Especifica las columnas y/o las tablas en las que se basa el REPORT. Adems, puede indicar criterios de ordenamiento de las filas. Puede haber mltiples sentencias SELECT -en sus formas habituales-, separadas por ;. En caso de mltiples sentencias SELECT, todas excepto la ltima deben contener la clusula INTO TEMP, y slo la ltima puede tener la clusula ORDER BY. Seccin FORMAT Debe estar presente, ya que determina el modo en que aparece el reporte. Trabaja con los datos producidos por la seccin SELECT. Hay dos formas tpicas para esta seccin, mutuamente excluyentes: FORMAT EVERY ROW sentencia END Es la ms sencilla. Produce un REPORT default, ya que lista los datos encabezados por el nombre de las columnas. FORMAT PAGE HEADER bloque-de-control PAGE TRAILER bloque-de-control FIRST PAGE HEADER bloque-de-control ON EVERY ROW bloque-de-control ON LAST ROW bloque-de-control BEFORE GROUP OF nombre-variable bloque-de-control AFTER GROUP OF nombre-variable bloque-de-control END REPORT Mediante los bloques-de-control se pueden indicar encabezamientos, pies de pgina, qu hacer en cada fila, en la ltima, antes o despus de cada grupo de filas, etc. Cada bloque es opcional, pero al menos uno debe estar presente. Adems, cada bloque debe incluir al menos una sentencia.

50

Las posibles sentencias que componen un bloque son: for ind-loop = exp1 to exp2 [step exp3] do sentencia if exp then sentencia1 [else sentencia2] let variable[num1[,num2]] = lista-exp need exp-num lines pause [string] print [lista-exp][;] print file "nombre-archivo" skip num lines skip to top of page ind-loop debe estar definido en la seccion DEFINE exp-3 no puede ser negativo

num1 y num2 se usan para indicar rangos de variables CHAR exp-num indica el nmero de lneas que se necesitan para imprimir lo que sigue. Si no est disponible, cambia de hoja En los reportes a pantalla, produce su detencin hasta que el usuario presione RETURN. Si est presente, string contiene un mensaje a mostrar. lista-exp contiene una o ms expresiones a ser impresas, separadas por , ; si est presente, suprime el caracter NEWLINE. Incluye en el REPORT el contenido de un archivo texto Indica que produzca un salto de num lneas Indica que produzca un salto de pgina. No puede ser usada en un bloque de control FIRST PAGE HEADER, PAGE HEADER o PAGE TRAILER.

while exp do sentencia

51

Funciones Agregadas Hay un conjunto de funciones agregadas que permiten sumarizar informacin en un Report. [GROUP] { COUNT | PERCENT | { { TOTAL | { AVERAGE | AVG } | MIN | MAX } OF expr1 } } [WHERE expr2] GROUP COUNT PERCENT TOTAL AVERAGE/ AVG MIN MAX expr1 Si est presente, indica que los totales se calculen sobre un grupo formado con la clusula ORDER BY. Slo se puede utilizar en un bloque de control AFTER GROUP OF. Cuenta el total de filas seleccionadas por la sentencia SELECT y si est presente por la clausula WHERE expr2 de la funcin agregada. Evala el total de filas involucradas en la SELECT y la clusula WHERE expr2 como un porcentaje de las filas totales. Evala el total de expr1 de las filas calificadas por la sentencia SELECT y la clusula WHERE expr2. Evala el porcentaje de expr1 de las filas calificadas por la sentencia SELECT y la clusula WHERE expr2 Evala el mnimo de expr1 de las filas calificadas por la sentencia SELECT y la clusula WHERE expr2 Evala el mximo de expr1 de las filas calificadas por la sentencia SELECT y la clusula WHERE expr2 Es la expresin que evalan las clusulas recin descriptas. Es tpicamente una columna numrica o una expresin que involucra una columna numrica

Por ltimo, hay una serie de funciones que se utilizan al momento de impresin y que proveen determinadas funciones auxiliares. Ellas son: ASCII num-expr Evala la expresin numrica como un carcter. Se utiliza para mostrar caracteres de control. char-expr CLIPPED Muestra el campo caracter que lo precede sin los blancos de relleno. COLUMN num-expr Posiciona el siguiente item en la columna indicada DATE Muestra un string con la fecha del da DATE(date-expr) Convierte la expresin con que es llamada a una de tipo Date. DAY(date-expr) Retorna el da de la fecha con que es invocada. LINENO Tiene el valor del nmero de lnea actual del reporte. 52

MDY(num-exp1, num-exp2, numexp3) MONTHdateexpr PAGENO num-expr SPACE[S] TIME TODAY expr1 USING expr2 WEEKDAY(dateexpr) YEAR(date-expr)

Devuelve una fecha a partir de los parmetros: da, mes y ao Retorna el mes de la fecha con que es invocada Tiene el valor del nmero de pgina actual del reporte. Produce el nmero deseado de espacios Retorna la hora Retorna el da de la fecha en un tipo Date Para dar formato a expresiones numricas o fechas Retorna el da de la semana de la fecha Retorna el ao de la fecha con que es invocada

53

Trabajos Practicos
PRACTICA I 1. Crear a travs de los menes la base de datos PRACTICA y las siguientes tablas, con los ndices que se indiquen segn la estructura consignada: Tabla CLIENTE Nombre Campo Tipo Nro_Cliente Serial Nombre Char(15) Apellido Char(15) Compania Char(20) Direccion Char(20) Cod_Pos SmallInt Cod_Provi Integer Telefono Char(15) Indices: Nro_Cliente, sin duplicaciones Tabla NOTAS_CLIENTE Nombre Campo Tipo Nro_Cliente Integer Referencia Char(30) Indices: Nro_Cliente, con duplicaciones Tabla PROVI Nombre Campo Tipo Cod_Provi Serial Nom_Provi Char(20) 2. Modifique la Tabla CLIENTES incorporando la columna Localidad Char(10) de modo que aparezca antes de Cod_Pos. 3. Crear mediante comandos las siguientes tablas, con los ndices que se indiquen segn la estructura consignada:

54

Tabla PROVEEDOR Nombre Campo Tipo Cod_Prov Smallint Nom_Provi Char(20) Indices: Cod_Prov, sin duplicaciones Tabla ORDENES Nombre Campo Tipo Nro_Orden Serial Fecha_Orden Date Nro_Cliente Integer Instr_Envio Char(20) Fecha_Envio Date Precio_Envio Money(10,2) Fecha_Pago Date

Indices: Nro_Cliente, con duplicaciones Nro_Orden, sin duplicaciones Tabla ITEMS Nombre Campo Nro_Item Nro_Orden Nro_Stock Cod_Prov Cantidad Tipo SmallInt Integer SmallInt SmallInt Integer

Indices: Cod_Prov, con duplicaciones Nro_Stock, Cod_Prov, con duplicaciones Nro_Item, Nro_Orden, sin duplicaciones

55

Tabla STOCK Nombre Campo Tipo Nro_Stock SmallInt Cod_Prov SmallInt Descripcion Char(20) Precio_Unit Money(10,2) Cod_Uni Char(3) Indices: Nro_Stock, Cod_Prov, sin duplicaciones Tabla UNIDAD Nombre Campo Cod_Uni Desc_Uni Tipo Char(3) Char(20)

56

PRACTICA II -FORMS1. Generar un archivo de especificacin de pantalla default para ORDENES. 2. Modificar la seccin SCREEN del anterior, de modo tal de centrar la parte que aparece en pantalla con ttulos adecuados para cada columna. 3. Incorporar los atributos REVERSE y UPSHIFT para las columnas Nro_Orden e Instr_Envio respectivamente. Observar el efecto. 4. Modificar las columnas de tipo DATE para que las fechas aparezca de la forma dd-mmyyyy, con un comentario al pie sobre la forma de ingresarlos. 5. Mostrar el nombre del cliente que est haciendo la orden a la derecha del nmero, validando que no se est ingresando una orden de un cliente inexistente. 6. Que proponga la fecha del da por default para la fecha de la orden. 7. Generar una pantalla para CLIENTES y ORDENES. 8. Restringir el ingreso de Cod_Provi a nmeros entre 1 y 24, mostrando el nombre de la provincia a la que corresponda. 9. Modificar el FORM para que Telefono permita el ingreso de 2 nmeros. 10. Generar una pantalla para ORDENES e ITEMS. 11. Cambiar los delimitadores por espacios. 12. Una vez ingresados todos los item de una orden, calcular la cantidad de item que la componen y mostrar el resultado por pantalla. 13. Alterar el movimiento del cursor de modo tal que se ingrese la fecha de envo de la orden luego del ingreso de la fecha de la orden. 14. Calcular el monto a pagar por item y mostrarlo para cada uno. 15. Mostrar el monto total de la orden en el ltimo rengln de la pantalla.

57

PRACTICA III 1. Seleccionar todos los datos de CLIENTES. 2. Listar el cdigo de la provincia BUENOS AIRES. 3. Seleccionar los item cuyo nmero de item sea mayor que 2. 4. Listar los clientes que vivan en CAPITAL. 5. Seleccionar los productos cuyo cdigo de proveedor sea 3 y su precio unitario menor que 30. 6. Listar los clientes que no tengan telefono. 7. Listar la descripcin cdigo de proveedor y nmeros de stock de los productos que empiecen con "P". 8. Listar las provincias que comiencen con "SA". 9. Listar nmero de stock cdigo de proveedor y descripcin de los artculos cuya descripcin termine con "TENIS" o comience con "B". 10. Listar los clientes cuyo nombre empiece con "M" o "A" o que termine con "S". 11. Listar nmero de orden y nmero de cliente de aquellas ordenes cuya fecha de pago supere a la fecha de envo en ms de 2 das. 12. Listar el stock ordenado por cdigo de artculo. 13. Listar las ordenes de abril ordenadas por nmero de orden.

58

PRACTICA IV 1. Seleccionar todos los datos de STOCK y PROVEEDOR. 2. Listar nmero de stock, cdigo de proveedor, descripcin y precio unitario de los artculos de STOCK. 3. Listar nmero de cliente, nombre, apellido, direccin, provincia y cdigo postal de CLIENTES. 4. Listar nmero de item, nmero de orden, nmero de stock, descripcin, cdigo de proveedor y nombre del proveedor ordenado por nmero de item. 5. Idem 4 donde la cantidad supere las 300 unidades. 6. Imprimir para cada cliente las ordenes que tenga asociadas 7. Imprimir para cada orden los item que la forman ordenados por fecha de orden. 8. Imprimir nmero de orden, fecha, nombre del cliente y total de la orden para aquellas ordenes cuyo total exceda las 250 unidades. 9. Imprimir la descripcin y precio unitario de los artculos de STOCK cuyo cdigo de proveedor sea 1, ordenados por nmero de stock. 10. Listar las ordenes de cada cliente con nmero de cliente, nombre, nmero de orden, monto total de la orden, ordenado por nmero de cliente para aquellas rdenes cuyo monto total sea superior a 200. 11. Determinar el producto ms vendido indicando su nmero de stock, descripcin y proveedor. 12. Determinar cul es el artculo de mayor precio unitario y cul es el promedio de pedidos para ese artculo.

59

PRACTICA V -REPORTS1. Generar un REPORT default sobre STOCK y modificarlo para que salga ordenado por nmero de stock y, en caso de igualdad por nmero de proveedor. 2. Modificar el reporte para que el largo de hoja sea de 72, el margen superior de 3 lneas, el inferior de 2 y los mrgenes derecho e izquierdo de 4 espacios. 3. Agregar ttulos y encolumnar el REPORT. 4. Mostrar el nmero de pgina en el centro de la hoja en la ltima lnea antes de cambiar de pgina. 5. Imprimir la cantidad total de artculos listados al final del REPORT. 6. Producir el mismo REPORT pero con cortes de control por cdigo de proveedor imprimiendo la cantidad de artculos que provee cada uno. 7. Imprimir los clientes incluyendo la provincia donde viven y sus referencias con corte de control por provincia. 8. Emitir un REPORT a pantalla que muestre por pginas todas las ordenes de compra efectuadas por los clientes ordenadas por fecha de emisin con corte por cliente. Antes de cada grupo de rdenes imprimir el nmero y el nombre del cliente y despus la cantidad de rdenes efectuadas por cada uno y el monto total. 9. Imprimir un REPORT al archivo SALIDA con las rdenes de compra con los item que la conforman, el nmero de stock, la descripcin el cdigo y nombre del proveedor, la cantidad pedida por item y la cantidad total de la orden. Imprimirlo ordenado por nmero de orden con los ttulos adecuados y con el nmero de la hoja en el margen superior derecho.

60