Professional Documents
Culture Documents
CURSO DE INFORMIX-SQL
Convenciones utilizadas
COMANDO
Descripción
Descripción del propósito general del comando.
Sintaxis:
SE Sintaxis del comando para el manejador Standard Engine
2
Introducción
Estructura del menú de SQL
Informix-SQL
3
Tipos de Datos en SQL
Cada columna de una base de datos debe tener asignado uno de los siguientes tipos
de datos:
4
DATETIME c1 TO c2 Permite almacenar un instante de tiempo con mucha más
SE y OL granularidad que un campo DATE. Su precisión puede variar de
años a fracciones de segundo. c1 y c2 pueden ser: YEAR,
MONTH, DAY, HOUR, MINUTE, SECOND o FRACTION(n),
con n indicando la cantidad de dígitos significativos con un
default de 3.
5
Comandos de SQL
Transacciones Tablas
BEGIN WORK CREATE AUDIT
COMMIT WORK DROP AUDIT
ROLLBACK WORK RECOVER TABLE
START DATABASE
ROLLFORWARD DATABASE
5 - Sentencias Auxiliares
6
Lenguaje de Definición 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
Descripción
Esta sentencia se utiliza para crear una nueva Base de Datos.
Sintaxis:
• 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
cláusula 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 caída.
• En ambos casos, el modo ANSI adiciona las siguientes prestaciones:
Todas las sentencias son tratadas como transacciones automáticamente, en
modo unbuffered
Las referencias a las tablas, vistas, sinónimos, í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 sinónimos.
• La base de datos creada queda como la base de datos activa.
7
DATABASE
Descripción
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 cláusula EXCLUSIVE se utiliza para impedir que otros usuarios ingresen a la base de
datos. Si alguien la está usando, reporta un error.
CLOSE DATABASE
Descripción
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
8
DROP DATABASE
Descripción
Esta sentencia se utiliza para borrar una Base de Datos completa, incluyendo todos los
catálogos 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 confirmación.
• 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.
9
CREATE TABLE
Descripción
Esta sentencia se utiliza para crear una nueva tabla en la Base de Datos, especificando
restricciones de integridad sobre las columnas, diseñar el tamaño de los extents inicial y
subsiguientes y especificar cómo será el locking de esa tabla.
Sintaxis
SE CREATE [TEMP] TABLE Nombre-Tabla
(Nombre-Columna Tipo-Dato [Cláusula Default] [NOT NULL],...
[Cláusula CONSTRAINT])
[IN "pathname"]
• Los nombres de las tablas deben ser únicos dentro de la base de datos. En una base
ANSI, la combinación Propietario.Nombre-Tabla debe ser único.
• Una tabla temporaria dura por la sesión de trabajo, y su nombre no puede coincidir con
ninguna tabla, vista o sinónimo de la base de datos.
• Al menos una columna debe figurar al crear la tabla.
• En las tablas temporarias se puede especificar una cláusula WITH NO LOG para indicar
que no registre en el transaction log file las operaciones sobre esa tabla.
• Se puede indicar dónde 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. Más aún, se puede especificar el tamaño del primer
extent y el de los siguientes (debe hacerse en páginas, con un mínimo 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 cláusulas:
• UNIQUE indica que no admita valores duplicados para esa columna. No es válida 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. Sólo una definición de
Primary Key es válida por tabla. No es válida sobre columnas de tipo BYTE o TEXT.
• FOREIGN KEY se utiliza para definir una columna o conjunto de columnas como una
clave externa, para propósitos de establecer relaciones o joins con otras tablas, en las que
deberá haber una Primary Key para coincidir. Para eso se indica con la cláusula
REFERENCES la tabla con la cual se está estableciendo la relación, 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 válida
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 comparación, 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 cláusula Default es:
• Con ella se puede indicar un valor literal o nulo para una dada columna
• CURRENT es válida para datos del tipo DateTime, y asigna el valor del instante de
acuerdo a la precisión indicada.
• USER asigna un literal con el nombre del usuario
• TODAY asigna la fecha del día
11
• SITENAME o DBSERVERNAME (son sinónimos) asigna el nombre del server.
12
ALTER TABLE
Descripción
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 | Sinónimo] }
{ ADD (Nombre-Columna-Nueva Tipo-Dato [Cláusula DEFAULT]
[NOT NULL] [Cláusula CONSTRAINT]
[BEFORE Nombre-Columna-Existente][,...])
| DROP (Nombre-Columna-Vieja[,...] )
| MODIFY (Nombre-Col-Existente Tipo-Dato-Nuevo [Cláusula DEFAULT]
[NOT NULL] [Cláusula CONSTRAINT] [, ...])
| ADD CONSTRAINT [Cláusula CONSTRAINT]
| DROP CONSTRAINT [(] Nombre-Constraint [,...)] }
OL | MODIFY NEXT SIZE kbytes
OL | LOCK MODE { ( PAGE | ROW ) }
13
RENAME TABLE
Descripción
Esta sentencia se utiliza para cambiar el nombre de una tabla
Sintaxis
RENAME TABLE [Propietario.]Nombre-Viejo TO Nombre-Nuevo
• Sólo 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 transacción (no se vuelve atrás).
DROP TABLE
Descripción
Esta sentencia se utiliza para borrar una tabla, junto con sus datos
Sintaxis
DROP TABLE { Nombre-Tabla | Sinónimo }
• Sólo puede eliminar la tabla su propietario o aquel que tenga privilegio de DBA.
• Al eliminar una tabla, se borran todos sus datos, índices, constraints, sinónimos y vistas.
• En SE no sirve incluir esta sentencia en una transacción (no se vuelve atrás).
14
Vistas
Las vistas -views- son un nivel elevado de abstracción 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 más de una tabla o valores resultantes de
funciones sobre las columnas.
Las vistas son ventanas dinámicas de la base de datos, marcando una diferencia
sustancial con las tablas temporarias, que sólo 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 definidas en función de otras vistas. Cuando se elimina la
vista origen, se eliminan todas las que dependen de ella. Las consultas a través de una vista
son tratadas como si fuesen sobre una tabla. A través de las vistas se pueden hacer
inserciones, actualizaciones y borrados de las tablas con las siguientes consideraciones:
Al crear una vista, se reciben los mismos privilegios que los detentados sobre la
tabla subyacente. Si además esta tabla se creó con la cláusula WITH GRANT OPTION, se
pueden pasar estos privilegios a otros usuarios.
Si hay más de una tabla en la construcción de la vista sólo 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 más 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
definición de una vista.
• Los tipos de datos de las columnas de la vista se deducen de las columnas que le dan
origen.
DROP VIEW
Descripción
Esta sentencia se utiliza para borrar una vista de una Base de Datos
Sintaxis
DROP VIEW { Nombre-Vista | Sinónimo }
CREATE SYNONYM
Descripción
Esta sentencia se utiliza para propocionar un nombre alternativo a una tabla o a una vista.
16
Sintaxis
CREATE [PUBLIC | PRIVATE] SYNONYM Sinónimo
FOR [Nombre-Tabla | Nombre_Vista]
• El modo default de creación de un sinónimo es Public, por el cual se pone este sinónimo
a disposición de todos los usuarios.
• No se puede crear un sinónimo para un sinónimo.
• En SE no sirve incluir esta sentencia en una transacción (no se vuelve atrás).
• En OL se puede crear un sinónimo para cualquier base de datos en el servidor de base
de datos, de la forma Nombre_BD:Nombre_tabla.
DROP SYNONYM
Descripción
Esta sentencia se utiliza para remover un sinónimo previamente definido.
Sintaxis
DROP SYNONYM Sinónimo
• Se debe ser el propietario del sinómimo o tener privilegio DBA para eliminarlo.
• En SE no sirve incluir esta sentencia en una transacción (no se vuelve atrás).
17
Estrategias de Indexación
Hay dos razones básicas para crear un índice sobre columnas de una tabla en una
base de datos:
Así resulta apropiado crear un índice sólo cuando es necesario y eliminarlo cuando
deja de serlo. Aunque esto es muy sencillo en este ambiente, conviene tener presentes
algunas consideraciones estratégicas.
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 optimización.
18
Estrategias de Indexacion-Indices Clustered
CREATE INDEX
Descripción
Esta sentencia se utiliza cuando se desea crear un índice para una o más columnas de una
tabla.
Sintaxis
CREATE [UNIQUE|DISTINCT] [CLUSTER] INDEX Nombre-Indice
ON {[Nombre-Tabla|Sinónimo]} (Nombre-Columna [ASC|DESC] ,...)
19
ALTER INDEX
Descripción
Esta sentencia se utiliza para organizar físicamente 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
DROP INDEX
Descripción
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 transacción (no se vuelve atrás).
• El uso de esta instrucción no tiene efecto sobre las constraints.
RENAME COLUMN
Descripción
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 transacción (no se vuelve atrás).
20
UPDATE STATISTICS
Descripción
Esta sentencia se utiliza para actualizar los datos en los system catalogs que se utilizan para
optimizar las estrategias de búsqueda y/o los stored procedures.
Sintaxis
UPDATE STATISTICS
[FOR {Nombre-Tabla|Sinónimo}]
[FOR PROCEDURE [Nombre_Procedure]]
21
Lenguaje de Manejo de Datos - DML
En el DML se incluyen las sentencias que nos permiten consultar, insertar,
modificar y/o eliminar información de las tablas de una base de datos.
SELECT
Descripción
Esta sentencia se utiliza para consultar la Base de Datos activa. Se compone de las 7
siguientes cláusulas, de las cuales únicamente son obligatorias SELECT y FROM
Sintaxis
SELECT <Cláusula-Select>
FROM <Cláusula-From>
[ WHERE Condición ]
[ GROUP BY Lista-Columnas ]
[ HAVING Condición ]
[ ORDER BY Nombre-Columnas [ASC|DESC] [,...]
[ INTO TEMP Nombre-Tabla [WITH NO LOG]]
<Cláusula-Select>
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 función agregada, la columna debe ser incluida en la
cláusula GROUP BY.
<Cláusula-From>
Outer Joins
Un outer join entre 2 tablas las trata asimétricamente. Una de las tablas es la
dominante y la otra es la sirviente. Si esta última no tiene filas que satisfagan la condición
de join, en la respuesta habrá una fila con valores nulos acompañando a la fila de la tabla
dominante que no tenga proyección. Por ejemplo, si tenemos las columnas zona de la tabla
t1 y region de la tabla t2 con los siguientes valores:
t1.zona t2.region
2 1
7 2
9 3
7
23
obtenemos como respuesta:
zona region
2 2
7 7
9 null
Cláusula WHERE
WHERE Condición
Condiciones de Comparación
Se pueden utilizar también 3 funciones que actúan 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 también las funciones agregadas -no combinadas con
columnas- o de fecha. Se ven más 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 expresión está dentro de un rango de valores. Se aplica a expresiones
numéricas o de fechas.
• expr [NOT] IN (listaval)
Para determinar si una expresión 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
más caracteres, y _ indica cualquier caracter en esa posición.
• nombre-col [NOT] MATCHES "string"
Para comparar columnas caracteres con un dado pattern. Valen los wildcards: * indica 0 o
más caracteres, ? indica cualquier caracter en esa posición, [...] 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 más tablas cuando son consignadas en la cláusula FROM y
se establece una relación en la cláusula 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 sección FROM.
Puede haber un outer join cuando cada fila de la tabla 1 es incluída en el resultado,
aunque no se cumpla la condición, en cuyo caso se completa con NULL.
25
Condición con Subqueries
• ALL se usa para tratar la comparación con todas las filas que retorne la sentencia
SELECT interior.
• ANY o SOME se usa para tratar la comparación con cualquier fila retornada por la
sentencia SELECT interior.
En todos los casos, en la sentencia SELECT interior sólo puede utilizarse una
expresión en su lista de selección y no puede tener una cláusula ORDER BY.
Cláusula GROUP BY
GROUP BY Lista_columnas
• Se utiliza para obtener una respuesta de una fila por cada grupo de filas que satisface la
condición del Where, con un valor para cada una de las columnas que conforman el
grupo.
• Al usar esta cláusula, toda columna que figure en la lista de selección impone que
también aparezca conformando el grupo.
• En lugar del nombre de las columnas, se puede incluir el número que indica su orden de
aparición en la lista de selección.
• Se puede agrupar hasta 8 columnas.
26
Cláusula HAVING
HAVING Condición
Cláusula ORDER BY
• Se utiliza para ordenar los resultados de la selección por los valores contenidos en una o
más columnas, que deben figurar en la lista de selección.
• En lugar del nombre de las columnas, se puede incluir el número que indica su orden de
aparición en la lista de selección.
• Se utiliza para crear una tabla temporaria con los resultados de la selección.
• La opción WITH NO LOG es soportada en el modo ANSI, y tiene efecto sólo si la base
tiene transaction log file.
Operador UNION
• El número de ítem de la lista de selección de cada select debe ser igual, y los tipos de
datos corresponderse uno a uno.
• Sólo se puede usar una cláusula ORDER BY en la última sentencia Select.
• Sólo se puede usar una cláusula INTO TEMP en la última sentencia Select.
• No se puede utilizar en un subquery o en la definición de una vista.
27
Funciones Agregadas
Se dispone de ciertas funciones que agregan cierta información sobre las filas
seleccionadas por la cláusula WHERE. Ellas son:
28
INSERT
Descripción
Esta sentencia se utiliza para insertar una o más filas nuevas en una tabla ya existente
Sintaxis
INSERT INTO Nombre-Tabla [( Lista-Columnas)]
{ VALUES (Lista-Valores)| SELECT -<Sentencia-Select> }
UPDATE
Descripción
Esta sentencia se utiliza para modificar los valores de una o más columnas en una o más
filas de la tabla.
Sintaxis
UPDATE Nombre-Tabla SET {Nombre-Columna = Expr [,...] |
{(Lista-Columnas) | *}= (Lista-Expr)}
[WHERE Condición]
• Si se modifica con una sentencia Select, los datos deben extraerse de otras tablas, y no se
puede usar la cláusula UNIQUE en la Select.
• Al insertar, intenta convertir datos.
• Todas las filas implicadas en una actualización son locked durante su ejecución. Si el
número de filas superara el máximo de locks simultáneos, o bien se reduce la
actualización o se hace un lock sobre toda la tabla.
29
DELETE
Descripción
Esta sentencia se utiliza para borrar una o más filas de una tabla
Sintaxis
DELETE FROM Nombre-Tabla [WHERE Condición]
• Todas las filas implicadas en un borrado son locked durante su ejecución. Si el número
de filas superara el máximo de locks simultáneos, 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 más de un usuario al acceder a los datos, se
cuenta con diferentes niveles de locking, que proporciona un adecuado nivel de control de
concurrencia.
Si se utiliza de este modo, los demás usuarios pierden toda posibilidad de modificar
o aún ver cualquier fila de esa tabla, dependiendo del modo en el que se hizo el lock. Si se
efectuó en modo SHARE, los demás usuarios podrán seleccionar datos de esa tabla, pero si
se hizo en modo EXCLUSIVE no podrán 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 características de las
operaciones a ejecutar (demasiadas filas involucradas, operaciones que afecten a to1da la
tabla, etc.)
Previsto para operaciones que involucren sólo algunas filas, hay dos posibilidades:
Cuando un usuario intenta una operación 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
Descripción
Esta sentencia se utiliza para prohibir el acceso de otros usuarios a una determinada tabla.
Sintaxis
LOCK TABLE Nombre-Tabla IN {SHARE | EXCLUSIVE} MODE
UNLOCK TABLE
Descripción
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
32
SET LOCK MODE
Descripción
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 código de error.
• El modo WAIT produce que, al invocar una fila que está locked, se espera por su
liberación. Aquí puede suceder que, si la fila no es liberada por problemas en el otro
proceso, no se salga de esta situación.
GRANT
Descripción
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}
33
• Privil-Tab: Uno o más de los siguientes tipos de acceso de nivel a la tabla (privilegios
múltiples deben separarse con comas):
REVOKE
Descripción
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}
• 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:
Transacciones
Las transacciones son un conjunto de operaciones que deben ser tratadas como una
unidad de trabajo.
Si el usuario detecta un error que invalide las operaciones efectuadas dentro de una
transacción, 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
transacción y la liberación de las filas que estaban locked. De todos modos hay operaciones
que no pueden ser canceladas como las de definición de datos o las de ceder o revocar
permisos.
Hay un límite para el número de locks simultáneos por lo que una transacción muy
grande puede ocasionar problemas con lo cual será necesario dividirla en dos transacciones
o hacer LOCK TABLE.
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 continuación 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:
CREATE AUDIT
Descripción
Esta sentencia se utiliza para crear un archivo de seguimiento de auditoría y comenzar las
registraciones en el mismo.
Sintaxis
SE CREATE AUDIT FOR {Nombre-Tabla | Sinónimo} 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
Descripción
Esta sentencia se utiliza para borrar un archivo de seguimiento de auditoría.
Sintaxis
SE DROP AUDIT FOR {Nombre-Tabla | Sinónimo}
• Se requiere tener el privilegio DBA o ser el propietario para usar esta sentencia.
36
RECOVER TABLE
Descripción
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 auditoría
Sintaxis
SE RECOVER TABLE Nombre-Tabla
• Se requiere tener el privilegio DBA o ser el propietario para usar esta sentencia.
BEGIN WORK
Descripción
Esta sentencia se utiliza para comenzar una transacción.
Sintaxis
BEGIN WORK
• Cada fila afectada por una sentencia UPDATE, DELETE o INSERT durante una
transacción es locked mientras no se cierra dicha transacción.
• En las bases de datos ANSI no es necesaria esta sentencia, pues las transacciones son
implícitas.
COMMIT WORK
Descripción
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 transacción.
37
ROLLBACK WORK
Descripción
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 transacción.
Sintaxis
ROLLBACK WORK
• Esta sentencia libera todas las filas y/o tablas involucradas en la transacción.
• En SE no se deshacen aquellas sentencias que, aún comprendidas en una transacción,
afecten la definición de las tablas o columnas, permisos, etc.
START DATABASE
Descripción
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
Descripción
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 están 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 después 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
Descripción
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 razón, típicamente una terminación 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
Descripción
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
Descripción
Esta sentencia se utiliza para cargar datos desde un archivo ASCII a una tabla, sinónimo o
vista de una Base de Datos existente.
Sintaxis
LOAD FROM “Path-Name” [DELIMITER “caracter” ]
INSERT INTO {Nombre-Tabla | Sinónimo | 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 carácter de escape, por lo que no hay que usarlo como
delimitador.
UNLOAD
Descripción
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
Descripción
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
Descripción
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 cómo mostrar y/o ingresar los datos. Puede tener varias páginas
de longitud y contener columnas de varias tablas.
Estructura
Sección 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
sección que debe estar presente.
without null input se utiliza cuando una base de datos no admite nulos. Muestra 0 para los
campos numéricos y espacios para los caracteres.
Sección SCREEN
SCREEN
{
....
display field layout de la pantalla
...
}
Puede haber varias pantallas definidas en esta sección con un máximo de 20 líneas
para cada una. Si son más, son automáticamente divididas en dos. La forma de los display
field es la siguiente:
texto [fieldtag]
43
Las mayúsculas y minúsculas son indistintas. Para mostrar más de un campo se
utiliza la barra |, de la forma
Sección TABLES
TABLES
nombre-tabla[ nombre-tabla]
Sección ATTRIBUTES
field-tag = field-descripcion;
Esta es la forma general de definir cada uno de los field-tag que aparecen en la
sección SCREEN. En esta sección se indica cómo 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.
field-tag [tabla.]columna[,attr-list];
tabla indica la tabla a la que pertenece la columna. Es necesaria cuando ese nombre de
columna se repite.
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
Columnas de join
A través de un FORM se pueden establecer joins de dos o más columnas del mismo
tipo, lo que redunda en mejor performance de los queries. La forma genérica de expresarlo
es:
Seccion INSTRUCTIONS
INSTRUCTIONS
[composites sentencia]
[delimiters sentencia]
[master sentencia]
[bloques de control]
END
Establece un join compuesto entre dos tablas y se usa cuando se deben especificar
los valores de más de una columna en una tabla para identificar unívocamente a una fila.
DELIMITERS "ab"
46
Bloques de Control
Indica que se ejecute el conjunto de acciones antes o después de que se ejecute una
operación.
47
Reports
Un REPORT se especifica mediante un archivo con las instrucciones que
especifiquen los datos que contendrá y el modo en que aparecerán impresos.
Estructura
Sección DATABASE
DATABASE
Nombre-Base-de-Datos
END
Sección DEFINE
DEFINE
PARAM sentencias
VARIABLE sentencias
END
48
Sección INPUT
INPUT
PROMPT FOR sentencias
END
Si está presente, esta sección permite al usuario interactuar durante la emisión del
REPORT permitiendo el ingreso de datos.
"string": es el mensaje que le aparece al usuario. Debe ir entre comillas. Puede haber más
de una sentencia PROMPT FOR en esta sección.
Sección 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 sección permite controlar los márgenes derecho, izquierdo,
superior e inferior, el largo de página y el dispositivo de salida.
49
Sección SELECT
select sentencia;
....
select sentencia;
end
Esta sección debe estar presente. Especifica las columnas y/o las tablas en las que se
basa el REPORT. Además, puede indicar criterios de ordenamiento de las filas. Puede
haber
múltiples sentencias SELECT -en sus formas habituales-, separadas por ;. En caso de
múltiples sentencias SELECT, todas excepto la última deben contener la cláusula INTO
TEMP, y sólo la última puede tener la cláusula ORDER BY.
Sección FORMAT
Debe estar presente, ya que determina el modo en que aparece el reporte. Trabaja
con los datos producidos por la sección SELECT.
Hay dos formas típicas para esta sección, mutuamente excluyentes:
FORMAT
EVERY ROW sentencia
END
Es la más 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
50
Las posibles sentencias que componen un bloque son:
51
Funciones Agregadas
[GROUP]
{ COUNT | PERCENT |
{ { TOTAL | { AVERAGE | AVG } | MIN | MAX } OF expr1 } }
[WHERE expr2]
GROUP Si está presente, indica que los totales se calculen sobre un grupo
formado con la cláusula ORDER BY. Sólo se puede utilizar en un
bloque de control AFTER GROUP OF.
COUNT Cuenta el total de filas seleccionadas por la sentencia SELECT y si
está presente por la clausula WHERE expr2 de la función agregada.
PERCENT Evalúa el total de filas involucradas en la SELECT y la cláusula
WHERE expr2 como un porcentaje de las filas totales.
TOTAL Evalúa el total de expr1 de las filas calificadas por la
sentencia SELECT y la cláusula WHERE expr2.
AVERAGE/ Evalúa el porcentaje de expr1 de las filas calificadas por la
AVG sentencia SELECT y la cláusula WHERE expr2
MIN Evalúa el mínimo de expr1 de las filas calificadas por la
sentencia SELECT y la cláusula WHERE expr2
MAX Evalúa el máximo de expr1 de las filas calificadas por la
sentencia SELECT y la cláusula WHERE expr2
expr1 Es la expresión que evalúan las cláusulas recién descriptas. Es
típicamente una columna numérica o una expresión que
involucra una columna numérica
Por último, hay una serie de funciones que se utilizan al momento de impresión y
que proveen determinadas funciones auxiliares. Ellas son:
53
Trabajos Practicos
PRACTICA I
1. Crear a través de los menúes la base de datos PRACTICA y las siguientes tablas, con
los índices que se indiquen según la estructura consignada:
Tabla CLIENTE
Tabla NOTAS_CLIENTE
Nombre Campo Tipo
Nro_Cliente Integer
Referencia Char(30)
Tabla PROVI
Nombre Campo Tipo
Cod_Provi Serial
Nom_Provi Char(20)
54
Tabla PROVEEDOR
Tabla ORDENES
Tabla ITEMS
55
Tabla STOCK
Nombre Campo Tipo
Nro_Stock SmallInt
Cod_Prov SmallInt
Descripcion Char(20)
Precio_Unit Money(10,2)
Cod_Uni Char(3)
Tabla UNIDAD
Nombre Campo Tipo
Cod_Uni Char(3)
Desc_Uni Char(20)
56
PRACTICA II -FORMS-
57
PRACTICA III
58
PRACTICA IV
59
PRACTICA V -REPORTS-
1. Generar un REPORT default sobre STOCK y modificarlo para que salga ordenado por
número de stock y, en caso de igualdad por número de proveedor.
2. Modificar el reporte para que el largo de hoja sea de 72, el margen superior de 3 líneas,
el inferior de 2 y los márgenes derecho e izquierdo de 4 espacios.
3. Agregar títulos y encolumnar el REPORT.
4. Mostrar el número de página en el centro de la hoja en la última línea antes de cambiar
de página.
5. Imprimir la cantidad total de artículos listados al final del REPORT.
6. Producir el mismo REPORT pero con cortes de control por código de proveedor
imprimiendo la cantidad de artículos 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 páginas todas las ordenes de compra
efectuadas por los clientes ordenadas por fecha de emisión con corte por cliente. Antes de
cada grupo de órdenes imprimir el número y el nombre del cliente y después 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 número de stock, la descripción el código y nombre del proveedor, la
cantidad pedida por item y la cantidad total de la orden. Imprimirlo ordenado por número
de orden con los títulos adecuados y con el número de la hoja en el margen superior
derecho.
60