You are on page 1of 140

SSSSSSSSS SSS SSSSSSS SSSSSSS SSS SSSSSSSSS QQQQQQQ QQ QQ QQ QQ QQ QQ QQ QQQ

QQQQQQ QQ LL LL LL LL LLLLLLLL LLLLLLLLL

// // // // // //

DDDDDDD DDDDDDDD DD DD DD DD DD DD

DDDDDDDD BBBBBBB BBBBBBBB BB BB BB BB BBBBBBBB BBBBBBBB 222222222 222 2222222 2222222 222 Begoa Ramos Barrios 222222222

INDICE ________

CONCEPTOS. Conceptos 1 Tablas 1 Tipos de datos que puede contener una columna de una tabla 2 Indices .. 2

MECANISMOS DE SEGURIDAD DE LOS DATOS. Vistas 2 Racf (Resource Access Control Facility) 3 Passwords de ficheros Vsam 3 Autorizacion 3

MECANISMOS DE INTEGRIDAD DE LOS DATOS. Concurrencia 3 Recuperacion de datos 3 - Unidad de recuperacion . 3 Ayudas a la programacion 4 - Spufi 4 - Paneles para preparacion de programas . 4 - Paneles para mantenimiento de planes .. 4 - DCLGEN (Declarations Generator) . 4

- Online Help 5

ESTRUCTURA DE UN PROGRAMA QUE OPERA EN UN ENTORNO CICS. Estructura de un programa que opera en un entorno cics 5 Preparacion del programa para la ejecucion 5 - Traslacion . 5 - Precompilacion 6 - Compilacion y link-edicion 6 - Binding . 6

INSTRUCCIONES S.Q.L. Instrucciones basicas 7 Clausula Where . 8 Select into . 8 Update 9 Delete 9 Insert 10 Insercion a la vez de varias filas de una tabla en otra .. 10 Funciones del cursor . 11 Declare cursor . 11 Open .. 12 Fetch . 12

II

Whenever not found 13 Update 13 Delete 14 Close . 14 Opciones de la instruccion select 15 - Operaciones aritmeticas 15 - Funciones Built-in .. 16 - Avg .. 16 - Max .. 16 - Min .. 16 - Sum .. 16 - Count 16 - Clausulas Group by, Having y Order by . 17 - Group by 17 - Having .. 18 - Order by 18 - Union 19 Seleccion de datos de varias tablas en una fila (join) 20 Opciones de las condiciones de busqueda 21 - Between And .. 21 - In 21 - Like . 21 - Is null . 22

VISTAS. Concepto . 22 Proceso de una vista . 23 Subquery . 24 Formas de incluir una subquery en una clausula where o

having 24 - Inmediatamente despues de un operador de comparacion.. 24 - Despues de un operador de comparacion seguido de all o any .. 25 - Despues de In, para indicar que el valor de la expresion debe estar entre los valores devueltos por la subquery .. 25 - Despues de Exists, verificacion de que puede ser encontrada una fila con la condicion de la subquery 26 Subquery correlativa . 26 Otros ejemplos . 26 - Con una SELECT 26 - Con una UPDATE 27 - Con una DELETE 27

SPUFI. Crear y probar instrucciones SQL . 27 Creacion de una tabla 28 Creacion de una vista 28 Creacion de una tabla 28 Crear un nombre alternativo o sinonimo para una tabla o vista y dar de baja ese sinonimo . 28

III

PANELES. Panel Principal 28 - Especificar un fichero de entrada .. 28 - Especificar un fichero de salida 28 - Especificar las opciones de proceso 29 Panel de opciones por defecto . 29 - Especificar otras opciones de proceso . 29 - Definir caracteristicas del fichero de salida .. 29 - Especificar defectos para el formato de salida . 30 Panel Commit/Rollback 30 Restricciones .. 30

CODIFICACION DE INSTRUCCIONES SQL EN UN PROGRAMA COBOL. Definir un area de comunicacion llamada SQLCA 31 Describir cada tabla o vista a la que acceda el programa . 31 Codificar instrucciones SQL 32 - Variables y estructuras host . 32 - Variables indicador . 33 Manejo de codigos de retorno de errores : LA SQLCA . 33 Manejo de condiciones excepcionales: Instruccion Whenever. 35 - Tres condiciones que se pueden especificar .. 36 - Dos acciones que se pueden especificar 36 Sugerencias para la codificacion de instrucciones SQL . 36 - Facilitar el uso de indices por el DB2 36 - Facilitar la seleccion de datos de dos o mas tablas .. 36 Notas sobre DB2 / SQL 37

APENDICE I.

Ejemplos de instrucciones sql en cobol II . 37 - Distinct 37 - Count 38 - Sum .. 38 - Union 39 - Between (not between) .. 40 - In (not in) 40 - Like (not like) .. 40 - Group by 40 - Max .. 41 - Min .. 41 - Having .. 41

RECOMENDACIONES PARA EL DISEO DE APLICACIONES EN DB2. Administracion de datos . 42 Administracion de base de datos .. 42 Administracion del sistema DB2 43 Programador del sistema DB2 43 Operacion del sistema DB2 .. 44 Analisis de aplicaciones 44 Programacion de aplicaciones .. 45

IV

Soporte de centro de informacion . 45

Representantes de los usuarios 46 Macro actividades a desarrollar en un proyecto .. 46 - Planificacion . 46 - Hw/sw instal. . 46 - Diseo y desarrollo aplicacion .. 46 - Operacion y recuperacion .. 47 - Gestion Rdto. . 47

PLANIFICACION. Gestion del proyecto . 47 Seleccion de la aplicacion piloto 47 Definicion de estandares 48 Identificar los recursos a proteger . 48

DISEO Y DESARROLLO DE LA APLICACION. Establecer el entorno de desarrollo de la aplicacion .. 48 Analisis de aplicaciones 49 Diseo de Base de Datos . 49 Desarrollo y prueba de programas . 49 Paso de desarrollo a produccion .. 50

DISEO DE BASES DE DATOS. Introduccion 51

DISEO LOGICO DE BASES DE DATOS.

Analisis de datos . 51 Normalizacion .. 52 Integridad referencial .. 53

INTEGRIDAD DE DATOS. Un adecuado diseo de base de datos . 53 - Analisis total de los datos .. 53 - Normalizacion de los datos 53 Un adecuado diseo de modulos, codificacion y pruebas . 54

RENDIMIENTO Y CONCURRENCIA EN BASE DE DATOS. Concurrencia 55 Trabajo realizado por el DB2 para el SQL .. 55 Diseo fisico de bases de datos .. 56 Seleccion de indices . 60

CONCEPTOS _________

El DB2 es un sistema de manejo de bases de datos basado en un modelo relacional de datos. Rueda bajo sistema operativo MVS/SP como un subsistema de este:

+-+ | TERMINAL +-+ | +|+ | v | MVS/SD | | v +-+ +-+ | | v ++ | | |-+ | | | ++ | | BATCH ++ | | | | DB2 |<- | TSO y | | | | Sistema Operativo | | ++ | | CICS/OS/VS |-+ | ++ | | | v | | CICS/OS/VS |

| ++ | | IMS/VS | || DB | | ++ | v +-+

+||+

+-+ | +-+ | Datos | DL/I | |+ | Datos | DB2 | | +-+

| Bases de | | | Bases de | | IMS/VS | +-+

TABLAS

______

Los datos en las bases de datos DB2 estan disponibles para un programa de aplicacion como un conjunto de tablas. Las tablas son estructuras de datos de dos dimensiones, compuestas de FILAS y COLUMNAS. Un nombre de tabla esta formado por un identificador de la persona que creo la tabla, y de un nombre descriptivo de esta, separados por punto.

TIPOS DE DATOS QUE PUEDE CONTENER UNA COLUMNA DE UNA TABLA __________________________________________________________

. Cadenas de caracteres EBCDIC: CHAR VARCHAR - Cadenas de longitud fija - Cadenas de longitud variable

. Datos numericos: SMALLINT INTEGER DECIMAL FLOAT - Enteros binarios de media palabra - Enteros binarios de una palabra - Numeros decimales - Numeros de coma flotante

. Cadenas de caracteres graficos: GRAFHIC - DBCS (Double Byte Character Data) de longitud fija VARGRAPHIC - DBCS de longitud variable

INDICES _______

El DB2 proporciona dos mecanismos de acceso a tablas, acceso secuencial y acceso directo mediante indices. El indice debe ser unico. Estan basados en los valores de los datos de una o mas columnas, y son mantenidos automaticamente por el DB2 cuando se produce un cambio en los datos contenidos en la tabla. Un programa no se refiere a los indices, sino que el DB2 selecciona el indice para acceder a los datos que el programa requiere. El DB2 nunca usa como indice una columna que va a ser actualizada, o una columna que esta siendo comparada con otra de la misma fila.

MECANISMOS DE SEGURIDAD DE LOS DATOS ____________________________________

VISTAS ______

Permiten a un usuario acceder solo a ciertas filas o columnas de una tabla.

RACF (Resource Access Control Facility) _______________________________________

Proporciona control de acceso al DB2 por usuarios o aplicaciones no autorizados, a los ficheros vsam que contienen las bases de datos, a un dispositivo de acceso directo, etc.

PASSWORDS DE FICHEROS VSAM __________________________

Se usan en ficheros no protegidos con RACF.

AUTORIZACION ____________

Mediante instrucciones GRANT y REVOKE de identificadores de usuarios.

MECANISMOS DE INTEGRIDAD DE LOS DATOS _____________________________________

CONCURRENCIA ____________

El DB2 permite que mas de un programa acceda a los mismos datos al mismo tiempo. La concurrencia es controlada mediante LOCKS. Consisten en asociar un recurso DB2 con un programa, de forma que esta asociacion afecta a como pueden acceder otros programas al mismo recurso. Existen varios tipos: S (Share), U (Update), X (Exclusive), etc. Ningun programa podra acceder a los datos que hayan sido cambiados por otro programa, pero que todavia no esten en la base.

RECUPERACION DE DATOS _____________________

Unidad de recuperacion ______________________

Proceso que ocurre entre dos puntos de COMMIT. Es una secuencia de acciones que necesita ser completada para que cualquiera de las accio-

nes individuales que la forman pueda considerarse como acabada. Ejemplo: Una transaccion que transfiere fondos de una cuenta A a otra B, debera primero sustraer la cantidad a transferir de la cuenta A, y luego sumar a la cuenta B. Cuando se terminen ambas acciones, y no antes, los datos de ambas cuentas seran consistentes. Una unidad de recuperacion se seala como completa mediante un COMMIT o Synchronization (Sync) Point, de las siguientes formas: 1. Implicitamente al final de una transaccion: EXEC CICS RETURN

2. Explicitamente en puntos de la transaccion: EXEC CICS SYNCPOINT 3. Implicitamente : EXEC DLI TERM

4. Implicitamente en un programa BATCH-DLI : EXEC DLI CHKP Si ocurre una accion y otra no, se dice que la base de datos ha perdido su integridad o consistencia. Para lograr que los datos recuperen el valor que tenian antes de comenzar la unidad de recuperacion, se usa la opcion ROLLBACK para el comando SYNCPOINT.

AYUDAS A LA PROGRAMACION ________________________

Spufi: _____ Permite usar el SQL sin tener que codificar un programa completo mediante instrucciones que pueden ser ejecutadas y mostradas en el terminal.

Paneles para preparacion de programas: _____________________________________ Permiten la precompilacion, compilacion, link-edicion y binding de un programa. Solo se necesita especificar el nombre del fichero que contiene las instrucciones fuente.

Paneles para mantenimiento de planes:

____________________________________ Con las opciones BIND, REBIND, y FREE. Permiten crear, cambiar o borrar el plan de cualquier programa DB2.

DCLGEN (Declarations Generator): _______________________________ Usa la informacion del catalogo DB2 para: . Crear definiciones de las estructuras de tablas o vistas, que van a ser guardadas en librerias de Copys para su pos-

terior inclusion en los programas. . Producir instrucciones SQL DECLARE TABLE

ONLINE HELP: ___________ Proporciona ayuda durante la ejecucion del spufi.

ESTRUCTURA DE UN PROGRAMA QUE OPERA EN UN ENTORNO CICS ______________________________________________________

++ | APLICACION | | | | | | | | | | | | | | | | | | | +|+ | | v EXIT | | 2 SQLCA | | | | | | | | | | | | | 1 Area de datos <+ | | | |

| +> 3 Entrada al programa 5 Proceso 7 Mensaje de salida | | | | | | | v | |

4 Tratar mensaje de entrada | 6 Instrucciones SQL +

| | + 8 Terminacion

+||-|-|+

++ > ++ | CICS/OS/VS| | DB2 | ++ < ++

| ENTRY | CICS/OS/VS |

++

1- DB2 pone los valores de las columnas recuperadas en las variables del programa. 2- Cada programa que accede a datos DB2 debe tener un area de datos llamada SQLCA (SQL Comunication Area), usada por el DB2 para decir al programa si la ejecucion de la ultima instruccion SQL ha sido correcta, mediante un codigo de retorno , que se puede examinar en los campos SQLCODE y SQLWARN0 (deben ser cero y blanco).

PREPARACION DEL PROGRAMA PARA LA EJECUCION __________________________________________

a. Traslacion de las instrucciones EXEC por el CICS/OS/VS. __________

b. Precompilacion del programa. ______________ El precompilador busca errores de sintaxis, y prepara cada instruccion SQL para compilacion o ensamblaje, dando como resultado un conjunto de instrucciones fuente (modulo fuente). Ademas, el DB2 crea un DBRM (Data Base Request Module), que sera usado en el paso d, y contiene informacion acerca de cada instruccion SQL precompilada.

c. Compilacion ( o ensamblaje) y link-edicion. ___________ ____________

Cada modulo fuente es compilado o ensamblado para dar lugar a un modulo de carga. Al link-editar, los modulos de carga se enlazan en un unico modulo objeto.

d. Relacionar el programa y los datos DB2 (binding). _______ Se relaciona el programa (el DBRM que representa las peticiones SQL hechas por el programa) y las tablas y vistas DB2 que se quieren procesar. Esto da lugar a un plan de aplicacion, el cual es almacenado por el DB2 y usado cuando se ejecute el programa. El proceso de binding incluye los siguientes pasos: . Examinar la validez de los nombres de columnas, tablas y vistas utilizados en el programa . Verificar que la persona esta autorizada a realizar las operaciones de acceso especificadas por las instrucciones SQL del programa . Seleccionar los caminos de acceso a los datos DB2 que el programa quiere procesar Cuando se va a hacer bind de una aplicacion se puede especificar: - Isolation level: . RR el lock afecta a todas las filas que toca el programa . CS el lock afecta a todas las filas a las que el programa esta accediendo actualmente

Se puede hacer lock del espacio de tabla entero que contiene la tabla que se quiere proteger mediante una instruccion lock table: . Para permitir a otras aplicaciones recuperar, pero no actualizar, borrar o insertar filas se usa EXEC SQL LOCK TABLE nombre_de_tabla IN SHARE MODE END-EXEC

. Para impedir que otras aplicaciones accedan a la tabla de cualquier forma se usa EXEC SQL LOCK TABLE nombre_de_tabla IN EXCLUSIVE MODE END-EXEC - Resource adquisition time . USE, por defecto indica que se quieren adquirir los locks cuando los espacios de tablas asociados sean accedidos por primera vez . ALLOCATE indica que se quieren adquirir los locks cuando se aloca

el plan de aplicacion - Resource release time . COMMIT, por defecto indica que se quieren liberar los locks en cada punto de commit . DEALLOCATE indica que se quieren retener los locks hasta que termine el programa - Explain pa h selection . YES se pide al DB2 informacion acerca de las decisiones que esta tomando en el establecimiento de caminos de acceso a los datos . NO Si cambian las caracteristicas de la tabla o vista a la que accede el programa, el plan de aplicacion ya no es valido, y el programa no puede ser ejecutado. Cuando se intenta hacerlo, el DB2 automaticamente hace un rebind intentando crear un nuevo plan.

INSTRUCCIONES S.Q.L. ____________________

INSTRUCCIONES BASICAS ______________________

Las instrucciones en lenguaje S.Q.L. (Structured Query Language) permiten comunicar peticiones de acceso a datos al DB2. Es usado por el administrador de la base de datos para crear y cambiar definiciones de

datos, por el administrador del sistema en cuanto a autorizaciones a usuarios de los datos, y por el programador de aplicaciones para recuperar y actualizar datos. La primera clausula de una instruccion SQL dice al DB2 que operacion se quiere realizar. Los nombres de variables van precedidos de :.

CLAUSULA WHERE ______________

Especifica una condicion de busqueda que, identificara la fila o filas que se quieren recuperar, borrar o actualizar. La condicion de busqueda

puede estar formada por uno o varios predicados separados por AND y OR. El DB2 primero evalua las clausulas NOT, luego AND y por ultimo OR. Se puede cambiar el orden de evaluacion por medio de parentesis, que son examinados primero. Ejemplos: . WHERE NOT WORKDEPT = C01 . WHERE EMPNO = :EMPID . WHERE JOBCODE + EDUCLVL > 70 . WHERE SEX = V AND (DEPT = C1 OR DEPT = C2)

SELECT INTO ___________

Funcion _______ Recuperar una fila especifica.

Formato _______ EXEC SQL SELECT nombres_de_las_columnas que nos interesan INTO nombres_de_vbles usadas para contener los datos recuperados FROM nombre_de_la_tabla o vista que contiene los datos WHERE condicion_de_busqueda

END-EXEC Se pueden especificar hasta 300 columnas en la clausula SELECT. Si se quieren recuperar todas las columnas, en el mismo orden en que aparecen en la fila, se pondra un asterisco, en lugar del nombre de las columnas. el valor de la primera columna especificada se guardara en la primera

variable especificada en la clausula INTO, el de la segunda en la segunda, etc. Si ninguna fila satisface la condicion, el DB2 devuelve un codigo de NOT FOUND (SQLCODE=100). Si la clausula WHERE permitiera recuperar los valores de las columnas de dos o mas filas, DB2 devuelve un codigo de error en el SQLCODE y no recupera nada. Si varias filas cumplieran la condicion, se usara una instruccion DECLARE CURSOR para seleccionar las filas, seguida de una instruccion FETCH para mover los valores de las columnas a las variables una fila cada vez.

UPDATE ______

Funcion _______ Cambiar el valor de una o mas columnas en cada fila que satisface la condicion de busqueda de la clausula WHERE. Tambien se puede usar para borrar un valor de una fila , cambiando el valor de la columna a NULL.

Formato _______ EXEC SQL UPDATE nombre_de_la_tabla o vista SET columnas que se quieren actualizar = nuevo valor WHERE condicion_de_busqueda END-EXEC El nuevo valor especificado para una columna puede ser el nombre de otra columna de la misma fila, una constante, una variable, una expresion aritmetica, un valor nulo, etc. Si se omite la clausula WHERE, el DB2 actualiza cada fila de la tabla o vista con los valores dados.

DELETE ______

Funcion _______

Quitar filas enteras de una tabla, no columnas especificas.

10

Formato _______ EXEC SQL DELETE FROM nombre_de_la_tabla o vista WHERE condicion_de_busqueda END-EXEC Si se omite la clausula WHERE, se borraran todas las filas de la tabla o vista. Para borrar la definicion de una tabla, ademas de su contenido, se usa la instruccion DROP.

INSERT ______

Funcion

_______ Aadir nuevas filas a una tabla o vista, se puede: . Especificar los valores de las columnas que se quieren insertar . Incluir una instruccion SELECT en la INSERT para decir al DB2 que los datos para la nueva fila estan contenidas en otra tabla o vista

Formato _______ EXEC SQL INSERT INTO nombre_de_la_tabla o vista (nombres de columnas) VALUES (valor_de_cada_columna especificada en la clausula INTO) END-EXEC Si se especifican menos nombres de columnas de los que hay en la fila, el DB2 les asigna valores por defecto. Si se intenta insertar una fila que duplica otra existente en la tabla: . Si la tabla tiene un indice unico, la fila no es insertada, y el DB2 proporciona un SQLCODE -803 . Si la tabla no tiene un indice unico, la fila es insertada sin error

INSERCION A LA VEZ DE VARIAS FILAS DE UNA TABLA EN OTRA TABLA _____________________________________________________________

Ejemplo:

Se crea una tabla llamada EMPTIME con las columnas EMPNUMBER, PROYNUMBER, STARTDATE y ENDDATE, y se usa la INSERT para llenarla.

11

EXEC SQL INSERT INTO USERA.EMPTIME (EMPNUMBER, PROYNUMBER, STARTDATE, ENDDATE) SELECT EMPNO, PROYNO, COMIENZO, FIN FROM END-EXEC En una SELECT embebida en una INSERT no se puede poner UNION ni ORDER BY. El numero de columnas de la SELECT debe ser el mismo de la INSERT. Los datos que se seleccionan deben ser compatibles con las columnas en las que se van a insertar. Para las columnas que no se especifiquen se insertaran los valores por defecto establecidos cuando se creo la tabla. Cuando se inserta una fila en una vista, si esta no contiene todas las columnas de la tabla base, el DB2 inserta en ellas valores por defecto. DSN.EMP

FUNCIONES DEL CURSOR ____________________

El cursor permite a un programa recuperar un conjunto de filas, y luego procesar una fila cada vez. El DB2 construye una tabla de resultados para guardar todas las filas recuperadas al ejecutar una instruccion SELECT, y utiliza el cursor para hacerlas disponibles al programa. Un cursor identifica la fila actual de la tabla de resultados, que el programa puede recuperar secuencialmente hasta que alcanza el fin de los datos ( SQLCODE=100, NOT FOUND). Un programa puede utilizar varios cursores, para cada uno de ellos se utilizan las siguientes instrucciones:

DECLARE CURSOR ______________

Funcion _______ Se usa para definir e identificar un conjunto de filas que van a ser accedidas con un cursor.

Formato _______ EXEC SQL DECLARE FROM nombre_del_cursor nombre_de_la_tabla CURSOR FOR SELECT columna 1, columna 2 ..

WHERE

columna 1 = condicion_de_busqueda columna 2 (columnas de cada fila que se quieren actualizar)

FOR UPDATE OF END-EXEC

12

La instruccion DECLARE CURSOR nombra un cursor. La instruccion SELECT define un conjunto de filas, que formaran la tabla de resultados. Es posible actualizar una columna de la tabla identificada aunque no sea parte de la tabla de resultados (que no haya sido nombrada en la instruccion SELECT), nombrandola en la clausula FOR UPDATE OF. Cuando DB2 evalua una instruccion SELECT, puede ocurrir que varias filas satisfagan la condicion de busqueda, y que algunas de ellas esten duplidadas. Para especificar que no se desean, se codificara: SELECT DISTINCT columna 1, columna 2, ..

OPEN ____

Funcion _______

Le dice al DB2 que se esta preparado para procesar la primera fila de la tabla de resultados.

Formato _______ EXEC SQL OPEN nombre_del_cursor END-EXEC

FETCH _____

Funcion _______ Mover a las variables del programa el contenido de la fila seleccionada.

Formato _______ EXEC SQL FETCH nombre_del_cursor INTO variable 1, variable 2 . END-EXEC Cuando se utiliza la instruccion FETCH, el DB2 usa el cursor para apun-

tar a la siquiente fila de la tabla de resultados.

13

WHENEVER NOT FOUND __________________

Funcion _______ Para detectar que ya no tenemos mas filas para procesar se puede: . Examinar si el SQLCODE tiene valor 100, esto ocurre cuando una instruccion FETCH ha recuperado la ultima fila de la tabla de resultados y se da otra FETCH. Ejemplo: IF SQLCODE = 100 GO TO NODATA. . Codificar la instruccion WHENEVER NOT FOUND bifurcando a otra parte del programa.

Formato _______ EXEC SQL WHENEVER NOT FOUND GO TO END-EXEC direccion_simbolica

UPDATE ______

Funcion _______ Una vez que se ha recuperado la fila actual, se puede actualizar esta con UPDATE.

Formato _______ EXEC SQL UPDATE SET END-EXEC Cada columna que se quiere actualizar debe haber sido nombrada previamente en la clausula FOR UPDATE OF de la instruccion DECLARE CURSOR. La clausula WHERE identifica el cursor que apunta a la fila que va a ser actualizada. Despues de actualizar una fila, la posicion del cursor permanece en esa fila hasta que se utilice una instruccion FETCH para la siguiente fila. Con la instruccion UPDATE se actualizan varias filas con una sola insnombre_de_la_tabla columna 1 = valor , columna 2 = valor .

WHERE CURRENT OF nombre_del_cursor

truccion SQL, mientras que UPDATE WHERE CURRENT OF, permite obtener una copia de la fila, examinarla, y entonces, actualizarla.

14

DELETE ______

Funcion _______ Una vez que se ha recuperado la fila actual, se puede borrar con DELETE.

Formato _______ EXEC SQL DELETE FROM END-EXEC La clausula WHERE identifica el cursor que apunta a la fila que va a ser borrada. Despues de borrar una fila, no se puede actualizar o borrar otra utilizando ese cursor, hasta que se de una FETCH para la siguiente fila. nombre_de_la_tabla WHERE CURRENT OF nombre_del_cursor

Con la instruccion DELETE se borran varias filas con una sola instruccion SQL, mientras que DELETE WHERE CURRENT OF, permite obtener una copia de la fila, examinarla, y entonces, borrarla.

CLOSE _____

Funcion _______ Cerrar el cursor una vez que se ha terminado de procesar las filas de la tabla de resultados si se quiere volver a utilizarlo. El DB2 cierra el cursor automaticamente cuando termina el programa.

Formato _______ EXEC SQL CLOSE nombre_del_cursor END-EXEC Si el programa completa una unidad de recuperacion todos los cursores abiertos son cerrados automaticamente por el DB2. Si el cursor se vuelve a abrir, el proceso comenzara al principio de la tabla de resultados, y se tendra que restablecer la posicion del cursor. Ejemplo: Supongamos que se quieren actualizar los datos de los empleados de la

tabla DSN.EMPL dando un SYNCPOINT cada 100 filas.

15

1. Declarar el cursor como conjunto de filas de EMPNO > UPD-EMP EXEC SQL SELECT EMPNO, SALARY FROM DSN.EMPL WHERE EMPNO > :UPD-EMP ORDER BY EMPNO END-EXEC (valor actual del limite mas bajo)

DECLARE EMPLEADO CURSOR FOR

2. Abrir el cursor y mover los datos de la tabla de resultados una fila cada vez, de forma que el limite mas bajo de la tabla se actualiza en UPD-EMP. EXEC SQL END-EXEC : EXEC SQL : FETCH EMPLEADO : INTO :UPD-EMP, :UPD-SAL

OPEN EMPLEADO

: END-EXEC

3. Borrar una fila EXEC SQL DELETE FROM DSN.EMPL

WHERE EMNO = :UPD-EMP END-EXEC

4. Al abrir el cursor de nuevo, la condicion de busqueda de la SELECT procesara la DSN.EMPL basandose en el valor actual de UPD-EMP.

OPCIONES DE LA INSTRUCCION SELECT _________________________________

OPERACIONES ARITMETICAS _______________________

La instruccion SELECT se puede usar para realizar operaciones aritmeticas con los datos antes de que sean proporcionados al programa. Esto se consigue mediante operadores aritmeticos en la lista de columnas. SELECT JOBCODE + 10 . . . Los operadores aritmeticos se pueden usar con columnas de datos definidos como INTEGER, SMALLINT, DECIMAL, o FLOAT, con constantes numericas, y variables. El valor de la expresion aritmetica se asigna a una variable, pero no reemplaza al valor de la columna de la tabla o vista.

16

FUNCIONES BUILT-IN __________________

Permiten obtener informacion acerca de las filas que satisfacen la condicion de busqueda. Se puede incluir mas de una en cada instruccion SELECT. La funcion BUILT-IN se aplica a cada fila que satisface la condicion de busqueda, ignorando los valores nulos.

AVG ___

Promedio de los valores de una o mas columnas que contengan datos numericos.

MAX ___

Maximo valor de una o mas columnas.

MIN ___

Minimo valor de una o mas columnas.

SUM ___

Suma del valor de una o mas columnas.

COUNT _____

. Numero de filas que satisfacen la condicion de busqueda: EXEC SQL SELECT COUNT(*) INTO EMP-COUNT FROM DSN-EMP WHERE JOBCODE >= 50 END-EXEC

17

. Numero de valores unicos de una columna en particular: EXEC SQL SELECT COUNT (DISTINCT DEPTNO) INTO DST-COUNT FROM DSN-EMP END-EXEC

CLAUSULAS GROUP BY, HAVING Y ORDER BY _____________________________________

No se pueden especificar en una instruccion SELECT dentro de la DECLARE CURSOR, cuando se pretenda actualizar una columna o borrar una fila.

GROUP BY ________

Divide las filas que satisfacen la condicion de busqueda en grupos, segun una o mas columnas especificadas en esta clausula. El resultado de la aplicacion de una funcion BUILT-IN, no sera ya un valor unico, sino

tantos valores como grupos. Si hay valores nulos en una columna especificada en GROUP BY, el DB2 los considera en un grupo por separado. Ejemplo: Calculo del salario medio por departamento el resultado sera una fila por departamento al no especificar WHERE, se procesan todas las filas. EXEC SQL DECLARE XYZ CURSOR FOR SELECT WORKDEPT, AVG(SALARY) FROM DSN-EMP GROUP BY WORKDEPT END-EXEC EXEC SQL FETCH XYZ INTO :WORK-DEPT, :AVG-SALARY END-EXEC Es posible agrupar por mas de una columna. Ejemplo: Calculo del salario medio por departamento y por sexo. El resultado seran dos filas por departamento (una por cada sexo), para las cuales se calculara el promedio.

18

EXEC SQL DECLARE XYZ CURSOR FOR SELECT WORKDEPT, SEX, AVG(SALARY) FROM DSN-EMP GROUP BY WORKDEPT, SEX END-EXEC EXEC SQL FETCH XYZ INTO :WORK-DEPT, :SEX, :AVG-SALARY END-EXEC

HAVING ______

Se usa seguida de la clausula GROUP BY, para especificar que solo se desean los grupos que satisfagan una condicion. Se codifica como la clausula WHERE, pudiendo contener predicados multiples, la clausula DISTINCT, HAVING NOT, y funciones BUILT-IN. Ejemplo: Calculo del salario medio de las mujeres por departamento, pero solo para los departamentos en los que todos los empleados poseen un nivel

de educacion igual o superior a 16. EXEC SQL DECLARE XYZ CURSOR FOR SELECT WORKDEPT, AVG(SALARY), MIN(EDUCLVL) FROM DSN-EMP WHERE SEX = F GROUP BY WORKDEPT HAVING MIN(EDUCLVL) >= 16 END-EXEC EXEC SQL FETCH XYZ INTO :WORK-DEPT, :AVG-SALARY, :MIN-EDUC END-EXEC

ORDER BY ________

Indica el orden en el que se quieren recuperar las filas, el cual se especifica mediante el nombre de la columna o columnas, o un numero (ORDER BY 3 especifica que se quiere ordenar por la tercera columna de la tabla de resultados) cuando en la SELECT no se ha especificado un nombre de columna sino una expresion aritmetida, funcion BUILT-IN, etc.

19

Todas las columnas de la claurula ORDER BY se han de haber especificado en la SELECT. Por defecto se toma orden ascendente. Si se encuentran valores nulos son tratados como los mas altos. Los caracteres graficos se ordenan en secuencia EBCDIC. Se pueden especificar secuencias de orden secundarias. Ejemplo: Recuperar el nombre y numero de departamento de las mujeres empleadas ordenado por numero de departamento descendente, y dentro de cada departamento por nombre de empleado. EXEC SQL DECLARE XYZ CURSOR FOR SELECT EMPNAME, WORKDEPT FROM DSN-EMP WHERE SEX = F ORDER BY WORKDEPT DESC, EMPNAME END-EXEC EXEC SQL FETCH XYZ INTO END-EXEC GM-NAME, :WORK-DEPT

UNION _____

Permite combinar dos o mas instrucciones SELECT para formar una unica tabla de resultados, eliminando las filas duplicadas. Se usa para mezclar valores de varias tablas, pero el conjunto de filas seleccionadas de una tabla es aadido al conjunto de filas seleccionado de otra. Los tipos de datos y longitudes de las columnas nombradas en la instruccion SELECT deben ser identicos. Por ejemplo, SELECT A, B UNION X, Y la columna A debe ser identica a la X, y la columna B a la Y. Para especificar las columnas por las que se quiere ordenar se deben usar numeros, y nunca nombres de columnas. Para identificar de que instruccion SELECT procede cada fila, se incluye una constante al final de la lista de cada SELECT. SELECT A, B, A1 UNION X, Y, B1 El DB2 devolvera la constante correspondiente a cada instruccion SELECT en la ultima columna de la fila.

20

Ejemplo: EXEC SQL DECLARE XYZ CURSOR FOR SELECT EMPNO FROM DSN.EMP1 WHERE WORKDEPT = :WORK-DEPT UNION SELECT DISTINCT EMPNO FROM DSN-EMP2 WHERE PROJNO = :NUM-PROY END-EXEC EXEC SQL FETCH XYZ INTO :EMP-NUMBER END-EXEC

SELECCION DE DATOS DE VARIAS TABLAS EN UNA FILA (JOIN) ______________________________________________________

Es posible formar una fila de la tabla de resultados para la cual una parte de las columnas procedieran de una tabla, y otra parte de otra. Si coinciden los nombres de columna de dos tablas, habra que calificarlos, poniendo como prefijo el nombre de la tabla. En la instruccion SELECT se listan los nombres de las columnas que se quieren. Si en su lugar se coloca un *, el DB2 devuelve una fila forma-

da por todas las columnas de la primera fila, unido a todas las de la segunda. Si no se especifica la clausula WHERE cada fila de la primera tabla es concatenada a cada fila de la segunda tabla para formar una tabla de resultados, cuyo numero de filas sera el producto del numero de filas de cada tabla. Ejemplo: A=3 B=2 AB=6 Este metodo se puede usar para crear una vista, pero esta no puede ser procesada mediante instrucciones UPDATE, DELETE o INSERT. Es posible unir una tabla o vista consigo misma, y hasta 7 tablas. Ei se usa la clausula GROUP BY en la definicion de una vista, la vista no puede ser unida con otra tabla. Ejemplo: Queremos recuperar las columnas EMPNO y LASTNAME de la tabla DSN.EMP1, y las columnas ACTNUM y EMPTIME de la DSN.EMP2.

21

EXEC SQL DECLARE XYZ CURSOR FOR SELECT EMP1.EMPNO, LASTNAME, ACTNUM, EMPTIME

FROM DSN.EMP1, DSN-EMP2 WHERE EMP1.EMPNO = EMP2.EMPNO END-EXEC EXEC SQL FETCH XYZ INTO :EMP-NUMBER, :NAME, :ACTIV, :TIME END-EXEC

OPCIONES DE LAS CONDICIONES DE BUSQUEDA _______________________________________

Todas ellas se pueden codificar con NOT.

BETWEEN AND _______________

Especifica que la condicion debe ser satisfecha por cualquier valor que este comprendido entre los dos valores especificados. WHERE EDUCLVL BETWEEN 13 AND 16

IN __

Indica que se esta interesado en las filas para las que el valor de la columna especificada esta entre los valores que se listan. WHERE WORKDEPT IN (A00, C01, E02)

LIKE ____

Indica que se esta interesado en las filas para las que el valor de la columna especificada es similar al que se proporciona. El grado de parecido es determinado por dos caracteres especiales usados en la cadena que se incluye en la condicion de busqueda:

22

. Un _ para cualquier caracter simple . Un % para una cadena de caracteres. A no ser que el % preceda a la cadena de caracteres, la cadena buscada puede comenzar en cualquier parte de la columna

Se usan cuando no se conocen todos los caracteres de una columna o no importa su contenido. Ejemplo: . Para encontrar todos los empleados que viven en San Jose, debemos estar seguros de que San Jose no es parte del nombre de otra ciudad, porque el DB2 nos devolveria tambien esa fila. WHERE TOWN LIKE %SAN JOSE% . Para encontrar todos los empleados que viven en ciudades que comienden por SAN. WHERE TOWN LIKE SAN%

IS NULL _______

Indica que se esta interesado en las filas para las que el valor de la columna especificada es nulo. WHERE CODIGO IS NULL Para indicar que se esta interesado en las filas para las que el valor de la columna especificada es blancos. WHERE CODIGO =

VISTAS ______

CONCEPTO ________

Una vista no contiene datos. Es una definicion almacenada de un conjunto de filas y columnas. Cuando un programa accede a los datos definidos por una vista, el DB2 procesa la definicion de la vista. El resultado es un conjunto de filas a las que el programa puede acceder mediante instrucciones SQL.

23

Una vista es como una ventana a traves de la cual un programa puede acceder solo a los datos que necesita. Las vistas se pueden usar intercambiablemente con las tablas cuando se recuperan datos, y pueden derivarse de una o mas tablas. Puede tener nombres de columnas diferentes de los nombres de las tablas. Las funciones de una vista son: - Seguridad: No permitir el acceso de algunos usuarios a todos los datos de una tabla.

- Hacer disponible a una aplicacion un subconjunto de una tabla, con lo cual es mas facil codificar instrucciones SQL ya que solo se ven las columnas y filas de una tabla que se necesitan. Una vista basada en una tabla de empleados puede contener filas solo para un determinado departamento. - Resumir datos de una tabla y hacerlos disponibles: . La suma de valores de una columna . El maximo valor de una columna . El promedio de valores de una columna . El resultado de una expresion aritmetica con una o mas columnas Cuando se actualizan los datos de una vista, se actualizan los datos de la tabla de la que se deriva, y, al contrario, si los datos de una tabla cambian, los datos accesibles a traves de vistas basadas en la tabla tambien cambian.

PROCESO DE UNA VISTA ____________________

Una vista se puede crear via SPUFI. Para insertar una fila en una tabla por medio de una vista, la fila debe tener un valor para cada columna de la tabla que no posee un valor por defecto.

Si se crea una vista usando funciones BUILT-IN o las clausulas DISTINCT o GROUP BY, solamente es posible usar la instruccion SELECT para ella. Si una columna de una vista es definida por medio de una expresion aritmetica, no se podra actualizar la columna o insertar filas en la vista. Si se crea una vista especificando WITH CHECK OPTION, todas las inserciones y actualizaciones contra la vista son chequeadas antes para comprobar que la fila esta conforme con la definicion de la vista. Si la vista es resultado de un JOIN, los datos de esta pueden ser seleccionados, pero no se puede insertar, borrar o actualizar.

24

No se puede crear un indice para una vista. Si la instruccion SELECT usada para crear una vista contiene un * en lugar de una lista de columnas, y mas tarde alguien aade otra columna a la tabla en la cual se basa la vista, la nueva columna no aparecera en la vista a menos que la vista sea creada de nuevo.

SUBQUERY

________

En una SELECT anidada en otra SELECT la primera se llama SELECT OUTER-LEVEL, y la interna SUBQUERY. Cuando se usa una SUBQUERY el DB2 la evalua, y sustituye el valor que resulta de ella en la clausula WHERE o HAVING de nivel superior, ya que puede existir una SUBQUERY dentro de otra, hasta cinco, e incluso, puede haber varias condiciones de busqueda conectadas por operadores relacionales, cada una con SUBQUERYS. La instruccion SELECT de una SUBQUERY solo puede especificar 1 columna, 1 funcion BUILT-IN o 1 expresion aritmetica. Una SUBQUERY no puede contener una clausula ORDER BY. Cuando la instruccion de nivel superior es otra SELECT: . La SUBQUERY puede basarse en la misma tabla o vista o en otra. . Se puede usar una SUBQUERY en una instruccion WHERE incluso si la SELECT es parte de una DECLARE CURSOR, INSERT o CREATE VIEW. Cuando la instruccion de nivel superior es UPDATE o DELETE la SUBQUERY no puede basarse en la misma tabla o vista.

FORMAS DE INCLUIR UNA SUBQUERY EN UNA CLAUSULA WHERE O HAVING _____________________________________________________________

1) Inmediatamente despues de un operador de comparacion ____________________________________________________

EXEC SQL DECLARE XYZ CURSOR FOR SELECT EMPNO, LASTNAME, JOBCODE FROM DSN.EMP1 WHERE EDUCLEVEL > (SELECT AVG (EDUCLEVEL) FROM DSN.EMP2 END-EXEC

25

EXEC SQL FETCH XYZ INTO :EMP-NUMBER, :NAME, :CODE END-EXEC

2) Despues de un operador de comparacion seguido de: ________________________________________________

. ALL, para indicar que el valor proporcionado debe ser comparado de una determinada forma con todos los valores que devuelva la SUBQUERY. Ej: WHERE EXPRESION > ALL SUBQUERY para satisfacer la WHERE, el valor de la expresion debe ser mayor que todos los valores devueltos por la SUBQUERY. Si la SUBQUERY no selecciona ningun valor la condicion es satisfecha. . ANY, para indicar que el valor proporcionado debe ser comparado de una determinada forma con cualquiera de los valores que devuelva la SUBQUERY. Ej: WHERE EXPRESION > ANY SUBQUERY

3) Despues de IN, para indicar que el valor de la expresion debe estar ___________________________________________________________________ entre los valores devueltos por la SUBQUERY. ___________________________________________

Ejemplo:

EXEC SQL DECLARE XYZ CURSOR FOR SELECT EMPNO, LASTNAME, JOBCODE FROM DSN.EMP1 WHERE EMPNO IN (SELECT DISTINCT EMPNO FROM DSN.EMP2 WHERE PROYNO = M1) END-EXEC EXEC SQL FETCH XYZ INTO :EMP-NUMBER, :NAME, :CODE END-EXEC

26

4) Despues de EXISTS para verificar que al menos puede ser encontrada __________________________________________________________________ una fila que cumpla la condicion de la SUBQUERY. _______________________________________________

Ejemplo: WHERE EXISTS SUBQUERY No es necesario especificar nombres de columna en la SELECT, sino *, ya que la SUBQUERY no va a devolver datos.

SUBQUERY CORRELATIVA ____________________

En una SUBQUERY normal, el DB2 ejecuta la SUBQUERY una vez, sustituye el resultado en la parte derecha de la condicion de busqueda, y evalua la SELECT de nivel superior segun el valor de la condicion de busqueda. Una SUBQUERY correlativa se ejecuta una vez para cada fila de la tabla o vista mencionada en la SELECT de nivel superior, de forma que se evalua la SUBQUERY para cada fila. Se usa para calcular algun valor que puede ser diferente para cada fila. Es igual que una normal excepto porque despues de especificar el nombre de la tabla en la clausula FROM, proporcionamos un nombre de correlacion, variable que representa la fila actual. Para especificar la correlacion se prefija el nombre de columna con un nombre de correlacion.

OTROS EJEMPLOS ______________

Con UPDATE o SELECT, la SUBQUERY y la instruccion de nivel superior deben referirse a diferente tabla. En una INSERT, ni la SUBQUERY ni la SELECT de nivel superior dentro de la INSERT, pueden basarse en la misma tabla en la que se inserta.

. Con una SELECT ______________ Esta SELECT recuperara las columnas especificadas para cada empleado cuyo JOBCODE es superior a la media de su departamento.

27

EXEC SQL DECLARE XYZ CURSOR FOR SELECT EMPNO, LASTNAME, WORKDEPT, JOBCODE FROM DSN.EMP ESTAFILA WHERE JOBCODE > (SELECT AVG (JOBCODE) FROM DSN.EMP WHERE WORKDEPT = ESTAFILA.WORKDEPT) END-EXEC

EXEC SQL FETCH XYZ INTO :EMP-NUMBER, :NAME, END-EXEC EPT, :CODE

. Con una UPDATE ______________ EXEC SQL UPDATE DSN.EMP1 ESTAFILA SET DATE = 9999 WHERE 840901 > (SELECT MAX (ENDATE) FROM DSN.EMP2 WHERE PROJNO = ESTAFILA.PROJNO) END-EXEC

. Con una DELETE ______________ EXEC SQL DELETE FROM DSN.EMP1 ESTAFILA WHERE NON EXISTS (SELECT * FROM DSN.EMP2 WHERE PROJNO = ESTAFILA.PROJNO) END-EXEC

SPUFI _____

SPUFI (SQL PROCESSOR USING FILE INPUT) permite:

- Crear y probar instrucciones SQL antes de incluirlas en un programa ________________________________

28

- Creacion de una tabla _____________________ CREATE TABLE TEMPL (EMPNO CHAR(6) NOT NULL, WORKDEPT CHAR(3) NOT NULL, JOBCODE DECIMAL(3) ) IN TESTTAB.DSN77EMP;

- Creacion de una vista

_____________________ La instruccion CREATE VIEW se usa para establecer la definicion de una vista. La vista se crea cada vez que es referenciada por una instruccion SQL. CREATE VIEW EMPDATA AS SELECT * FROM DSN.EMP WHERE WORKDEPT = C1

- Crear un nombre alternativo o sinonimo para una tabla o vista _____________________________________________________________ CREATE SYNONIM MITABLA FOR DSN.TABEMPL

y dar de baja ese sinonimo. ___________________________ DROP SYNONIM MITABLA

PANELES _______

1) Panel Principal _______________

. Especificar un fichero de entrada, _________________________________ que contiene las instrucciones SQL que se quieren ejecutar, cuya longitud de registro sera de 80 . Especificar un fichero de salida _________________________________, que recoge cada instruccion y el resultado de la ejecucion, que seran los datos recuperados en una SELECT, o un SQLCODE en otras. Tambien incluye estadisticas.

29

. Especificar las opciones de proceso ___________________________________ (YES por defecto) - CHANGE DEFAULTS: Poniendo YES se accede al panel de opciones por defecto. - EDIT INPUT: Editar o no el fichero de entrada. - EXECUTE: Ejecutar o no las instrucciones del fichero de entrada - AUTOCOMMIT: Dar o no un punto de COMMIT. - BROWSE OUTPUT: Displayar o no el fichero de salida.

2) Panel de opciones por defecto. _____________________________

. Especificar otras opciones de proceso _____________________________________ - ISOLATION LEVEL: Por defecto RR. RR (REPEATABLE READ), garantiza que los valores de la base de datos leidos o cambiados por SPUFI no pueden ser cambiados por otro programa hasta que SPUFI alcance un punto de COMMIT. CS (CURSOR STABILITY), garantiza que ningun programa puede modificar los datos de una fila en la cual SPUFI tiene posicionado un cursor. Esto proporciona maxima concurrencia. - MAX SELECT LINES: Por defecto 250. Maximo numero de filas que devolvera una SELECT.

. Definir caracteristicas del fichero de salida _____________________________________________

- RECORD LENGTH: Por defecto 4092. No puede ser menor que la del fichero de entrada. - BLOCK SIZE: Por defecto 4096. - RECORD FORMAT: Por defecto VB. - DEVICE TYPE: Por defecto SYSDA.

30

. Especificar defectos para el formato de salida ______________________________________________

- MAX NUMERIC FIELD: Por defecto 20. Anchura maxima para campos numericos. - MAX CHAR FIELD: Por defecto 80. Anchura maxima para campos de caracteres. - COLUMN HEADING: Por defecto NAMES. NAMES LABELS ANY BOTH

3) PANEL COMMIT/ROLLBACK _____________________

Si en el panel principal se especifica NO para AUTOCOMMIT, una vez que se completa la ejecucion se displaya este panel, en el que se indicara una de estas opciones: . COMMIT: Salvar los cambios en la base de datos. . ROLLBACK : Borrar los cambios en la base de datos. . DEFER

RESTRICCIONES _____________

Se pueden usar todas las instrucciones excepto: CLOSE DECLARE DESCRIBE EXECUTE FETCH INCLUDE OPEN PREPARE WHENEVER

Las opciones no soportadas por spufi son: . INTO en la SELECT . WHERE CURRENT en la UPDATE y DELETE

31

CODIFICACION DE INSTRUCCIONES SQL EN UN PROGRAMA COBOL ______________________________________________________

1) Definir un area de comunicacion llamada SQLCA _____________________________________________

Es un area de datos en la cual el DB2 devuelve informacion acerca del resultado de la ejecucion de cada instruccion SQL. WORKING-STORAGE SECTION EXEC SQL INCLUDE SQLCA END-EXEC Con esta instruccion el precompilador incluira: 01 SQLCA. 05 SQLCAID 05 SQLCABC 05 SQLCODE 05 SQLERRM. 49 SQLERRML 49 SQLERRMC 05 SQLERRP 05 SQLWARN. 10 SQLWARN0 10 SQLWARN1 10 SQLWARN2 10 SQLWARN3 PIC X(1). PIC X(1). PIC X(1). PIC X(1). PIC S9(4) COMP. PIC X(70). PIC X(8). PIC X(8). PIC S9(9) COMP. PIC S9(9) COMP.

05 SQLERRD OCCURS 6 TIMES PIC S9(9) COMP.

10 SQLWARN4 10 SQLWARN5 10 SQLWARN6 10 SQLWARN7 05 SQLEXT

PIC X(1). PIC X(1). PIC X(1). PIC X(1). PIC X(8).

2) Describir cada tabla o vista a la que acceda el programa ________________________________________________________

Esto puede hacerse de dos formas: . Codificando una instruccion DECLARE en la data division, especificando nombre de la tabla y listando cada columna y su tipo de dato. EXEC SQL DECLARE DSN.TDEPT TABLE (DEPNUM CHAR(3) END-EXEC NOT NULL, DEPNOM VARCHAR(36) NOT NULL)

32

. Previamente a la precompilacion con el DCLGEN. Para incluir en el programa las declaraciones producidas por DCLGEN EXEC SQL INCLUDE nombre_del_miembro END-EXEC

3) Codificar instrucciones SQL ___________________________

Cada instruccion comienza con EXEC SQL y termina con END-EXEC. En lugar de instrucciones COPY se codificara INCLUDE. No se pueden usar nombres de variables que comiencen por SQL, ni nombres de entradas externas o de plan que comiencen por DSN, ya que estan reservados para el DB2. No se pueden usar constantes figurativas como ZERO o SPACE en instrucciones SQL.

VARIABLES Y ESTRUCTURAS HOST ____________________________

Las variables HOST son campos de datos, definidos en el programa en la WORKING STORAGE o en la LINKAGE SECTION, y especificados en la

opcion INTO de una instruccion SELECT o FETCH, en los cuales se ponen los valores de los datos recuperados por el DB2. Las variables HOST se codifican en las instrucciones SQL precedidas por dos puntos. Una estructura HOST es un conjunto de variables HOST definidas en la DATA DIVISION del programa. Puede tener un maximo de dos niveles, excepto la declaracion de una cadena de caracteres de longitud variable que requiere un numero de nivel 49. Para identificar un campo dentro de una estructura en una instruccion SQL se codificara el nombre de estructura seguido de un punto y el nombre del campo. La parte entera de un numero nunca es truncada, si un numero no cabe en una variable o en una columna, se trunca la parte decimal si tiene y si no da un error. La declaracion de variables HOST se hace en niveles 01 o 77 (las de nivel 77 no pueden ser usadas en instrucciones SQL). Una cadena de caracteres de longitud variable debe tener un nivel de 01 a 48, y contener dos campos elementales a nivel 49: . Campo de longitud PIC S9(4) COMP. . Campo de valor PIC X(80). (Como maximo).

33

VARIABLES INDICADOR ___________________

Una variable indicador es un entero de media palabra. La variable indicador se especifica precedida de dos puntos inmediatamente despues de la variable HOST. Ejemplo: EXEC SQL SELECT TELFNUM INTO :TELEF:INDNULL FROM DSN.TABEMPL WHERE EMPNO = :EMPID END-EXEC Se usa para:

. Indicar si ha sido asignado un valor nulo a su variable asociada. ________________________________________________________________ Si el valor de la columna que se esta recuperando es nulo el DB2 pone un valor negativo en la variable indicador ( si no se usara esta daria un error), y el valor de la variable HOST no se alterara.

. Verificar que una cadena de caracteres recuperada no ha sido truncada _____________________________________________________________________

Si la variable indicador contiene un entero positivo, este especifica la longitud original de la cadena.

. Colocar un valor nulo en una columna ____________________________________ Cuando se procesa una instruccion UPDATE el DB2 chequea la variable indicador. Si esta contiene un valor negativo, el valor de la columna se pondra como nulo. Si contiene un valor mayor que -1 la variable asociada contiene un valor para la columna.

4) MANEJO DE CODIGOS DE RETORNO DE ERRORES : LA SQLCA __________________________________________________

SQLCAID _______

Cadena de caracteres (long 8) que identifica la SQLCA (valor SQLCA).

34

SQLCABC _______

Entero de una palabra que especifica la longitud de la SQLCA. Su valor es siempre 136 (X88).

SQLCODE _______

Es un entero de una palabra. Puede tener los siguientes valores: ZERO la instruccion se ha ejecutado correctamente -n ha ocurrido un error +n la instruccion se ha ejecutado correctamente pero ha ocurrido una condicion excepcional +100 no existen datos para procesar

SQLERRM _______

Cadena de caracteres de longitud variable (maximo 70) que describe una condicion de error.

SQLERRD _______

SQLERRD(3) indica el numero de filas insertadas, actualizadas o borradas en una tabla.

SQLWARN0 ________

Si es blanco, el resto de las variables SQLWARN tambien lo es. De otra forma sera W, y al menos otra SQLWARN sera tambien W.

35

SQLWARN1 ________

Si es W al menos el valor de una columna ha sido truncado al almacenarlo en una variable HOST.

SQLWARN2 ________

Si es W al menos un valor nulo ha sido eliminado de el conjunto de argumentos de una funcion.

SQLWARN3 ________

Si es W el numero de variables HOST especificado en una instruccion SQL es distINTO del numero de columnas en la tabla o vista.

SQLWARN4 ________

Si es W una UPDATE o DELETE dinamica no incluye una clausula WHERE.

5) MANEJO DE CONDICIONES EXCEPCIONALES: INSTRUCCION WHENEVER _________________________________________________________

Hace que el DB2 chequee la SQLCA y continue procesando el programa

o bifurque a otra area del programa si encuentra un error. Puede establecerse mas de una WHENEVER para una misma condicion a lo largo del programa, de forma que una WHENEVER afecta a todas las instrucciones SQL siguientes hasta que se encuentre otra. Ejemplo: EXEC SQL WHENEVER CONDICION ACCION END-EXEC

36

Se pueden especificar tres condiciones: ______________________________________

. SQLWARNING indica que se quiere hacer cuando SQLWARN0 = W o SQLCODE contiene un valor positivo distinto de 100.

. SQLERROR indica que se quiere hacer cuando SQLCODE < 0 . NOT FOUND indica que se quiere hacer cuando el DB2 no puede encontrar una fila que satisfaga la instruccion SQL o cuando no hay mas filas para hacer una fetch (SQLCODE=100)

Se pueden especificar dos acciones: __________________________________

. CONTINUE el programa continua su ejecucion. . GO TO el programa bifurca a otra area del programa, cuyo nombre ira precedido de dos puntos.

SUGERENCIAS PARA LA CODIFICACION DE INSTRUCCIONES SQL _____________________________________________________

Para facilitar el uso de indices por el DB2 ___________________________________________ . Usar BETWEEN en lugar de >= AND <=

. Evitar conversiones numericas especificando los mismos tipos de datos en las comparaciones, y usar datos de la misma longitud . Evitar el uso de predicados con LIKE que comiencen por % o _

. Evitar expresiones aritmeticas en un predicado

Para facilitar la seleccion de datos de dos o mas tablas ________________________________________________________ . Proporcionar datos redundantes en las JOIN de tablas . Usar JOIN en lugar de SUBQUERYS correlativas o de SUBQUERYS con IN

37

NOTAS SOBRE DB2 / SQL. _____________________

- DECLARE CURSOR. Esta sentencia SQL no actualiza el SQLCODE.

- SQLCODE = 100. Si se declara un cursor para la SELECT y no hay filas que satisfagan las condiciones de busqueda el DB2 nos devuelve un SQLCODE = 100 en la primera FETCH que se haga.

- SELECT SUM(COLUMNA) EN COBOL: Si no se efectuo la suma -no existen filas para las condiciones de busqueda- el valor que se devuelve en el campo resultado de la suma sera nulos y en determinados casos se produce un SQL = -305. Conclusion: Preveerlo en cobol utilizando indicador variable que devolvera valor negativo si el campo al que esta asociado contien valores nulos.

NOTA:

En CSP el campo que recoge la suma queda a ceros y el SQLCODE devuelve ceros.

APENDICE I __________

EJEMPLOS DE INSTRUCIONES SQL EN COBOL II ________________________________________

DISTINCT ________

*-* * LEER TABLA DE ALTAS DE CLIENTE. *

*-* BUSCA-ALTAS. MOVE TVACLTEA TO CVANORAA-A EXEC SQL SELECT DISTINCT CVANORAA, CVANCTAA INTO :CVANORAA-A, :CVANCTAA-A FROM FVAORALV WHERE CVANORAA = :CVANORAA-A END-EXEC.

38

COUNT _____

*-* *CUENTA EL NUMERO DE DOMICILIACIONES DE UNA ENTIDAD EMISORA * *-* CUENTA-DOMICILI. EXEC SQL SELECT COUNT (*) INTO :CDOIMPOP-M FROM FDOMAESV WHERE CDOEMISA = :CDOEMISA-M

END-EXEC.

SUM ___

*-* *SUMA EL CONTENIDO DEL CAMPO CVANTITP *-* 77 IND-NULL SELECT2-FVAORBCV. MOVE 0 TO IND-NULL CVANTITP-C SQLCODE. EXEC SQL SELECT SUM(CVANTITP) INTO :CVANTITP-C :IND-NULL FROM FVAORBCV WHERE CVAENTIA = :WS-ENTI-DEPOS-1234 AND CVACLTEA = :CVACLTEA-C CVAPIVAA = :CVAPIVAA-C CVAOBSTA = 03 CVATIOPA = 5 END-EXEC. IF SQLCODE = NOENCONTRADO OR IND-NULL < 0 THEN . . . AND AND AND PIC S9(4) COMP VALUE 0. *

39

UNION _____

** * SELECCIONAR DE CARTERAS LA SUMA DE TITULOS QUE EL * CLIENTE POSEE DE LA CLAVE VALOR AMPLIACION Y QUE * ESTEN EN SITUACION 0 O 1. * CARTERA. * * * *

* SE RECUPERARA UN FILA POR CADA DISTINTO CLTE EN CADA* ** DECLARE-CURSOR1. MOVE CORRECTO TO SQLCODE. EXEC SQL DECLARE CURSOR1 CURSOR FOR SELECT D.CVACLICA, SUM(CVAUNUMP CVAPNUMP + 1) FROM FVACARTV D WHERE (D.CVAENTIA = :W-ENTIDAD AND D.CVACLANA >= :WS-CVACLA00 AND D.CVACLANA <= :WS-CVACLA19 OR D.CVAENTIA = :W-ENTIDAD AND D.CVACLANA >= :WS-CVACLA40 AND D.CVACLANA <= :WS-CVACLA59) AND D.CVASITIA IN(0, 1)

GROUP BY D.CVACLICA UNION ALL SELECT P.CVACLICA, SUM(CVANTITP) FROM FVACAPRV P WHERE (P.CVAENTIA = :W-ENTIDAD AND P.CVACLANA >= :WS-CVACLA00 AND P.CVACLANA <= :WS-CVACLA19 OR P.CVAENTIA = :W-ENTIDAD AND P.CVACLANA >= :WS-CVACLA40 AND P.CVACLANA <= :WS-CVACLA59) AND P.CVASITIA IN(0, 1) GROUP BY P.CVACLICA ORDER BY 1 END-EXEC. IF SQLCODE NOT = CORRECTO AND SQLCODE NOT = NOENCONTRADO THEN MOVE DECLARE-CURSOR1 TO WS-PARRAFO MOVE FVACARTV PERFORM FIN-DB2. TO DET8-TABLA

40

BETWEEN (not between) _______

WHERE CAMPO1 BETWEEN 13 AND 16 igual que WHERE CAMPO1 >=13 AND CAMPO 1 <= 16

IN (not in) __

WHERE CAMPO1 IN (A00, C01, E21) igual que WHERE CAMPO1 = A00 OR CAMPO1 = C01 OR CAMPO1 = E21

LIKE (not like) ____

WHERE CAMPO1 LIKE TIO % (que empienza por TIO ) WHERE CAMPO1 LIKE %RAMIRO% (que lleva RAMIRO en cualquier posicion)

GROUP BY con clausulas AVG, MAX, MIN, HAVING ________ (AVG)

EXEC SQL DECLARE XMP1 CURSOR FOR SELECT DEPARTAMENTO, SEXO, AVG(SALARIO) FROM TABLA1 GROUP BY DEPARTAMENTO, SEXO END-EXEC. EXEC SQL FETCH XMP1 INTO :CAMPO1, :CAMPO2, CAMPO3 END-EXEC.

41

(Nos da la media de salario agupando por departamento y sexo.) ___________________________________________________________ (MAX)

EXEC SQL SELECT MAX(SALARIO) INTO :CAMPO1 FROM TABLA1

WHERE DEPARTAMENTO = AX21 END-EXEC.

(Nos da el mayor valor del campo salario del departamento AX21.) _____________________________________________________________ (MIN)

EXEC SQL SELECT MIN(SALARIO) INTO :CAMPO1 FROM TABLA1 WHERE DEPARTAMENTO = AX21 END-EXEC.

(Nos da el menor valor del campo salario del departamento AX21.) _____________________________________________________________ (HAVING)

EXEC SQL DECLARE XMP1 CURSOR FOR SELECT DEPARTAMENTO, AVG(SALARIO), MIN(EDLI) FROM TABLA1 WHERE SEXO = V GROUP BY DEPARTAMENTO HAVING MIN(EDLI) >= 16 END-EXEC.

EXEC SQL FETCH XMP1 INTO :CAMPO1, :CAMPO2, CAMPO3 END-EXEC. (Nos da la media del salario y el valor minimo del campo EDLI por departamento cuando el campo sexo sea = V y el minimo de EDLI sea mayor o igual que 16).

42

RECOMENDACIONES PARA EL DISEO DE APLICACIONES EN DB2 _____________________________________________________

WLM.-IBM Son varias las funciones involucradas en la implementacion de una aplicacion en DB2, debiendo tener en cuenta el que una misma persona puede realizar mas de una

funcion. Las principales funciones que sera necesario son: desarrollar

ADMINISTRACION DE DATOS _______________________

Las tareas a desarrollar consisten en, sobre la base de tener una vision corporativa de los datos, desarrollar modelos logicos y mantener diccionario de datos, ademas de : * Establecer convenciones para la denominacion de las entidades de datos, las relaciones entre datos y los atributos importantes. * Definir reglas de integridad de datos. * Desarrollar vistas de usuario. * Soporte al Administrador de base de datos y a los analistas de aplicaciones. * Participar en las sesiones de diseo de base de datos.

ADMINISTRACION DE BASE DE DATOS _______________________________

Es responsabilidad de esta funcion el diseo y creacion de objetos DB2, tales como tablas, vistas e indices, incluyendo ademas: * Diseo de modelos fisicos de datos. * Desarrollo de nombres estandard para objetos DB2 , tales como espacios de tablas, tablas, indices y vistas. * Definicion y creacion de objetos DB2. * Asistir a los analistas de aplicaciones en los prototipos funcionales.

43

* Desarrollar modelos de JCl para utilitis. * Recomendaciones de procedimiento de backup/recovery para las tablas de aplicacion. * Soporte a los programadores de aplicaciones en la prueba de las aplicaciones DB2. * Participar en las revisiones de diseo de aplicaciones. * Dar soporte tecnico a miembros del equipo de desarrollo.

ADMINISTRACION DEL SISTEMA DB2 ______________________________

Es responsabilidad de esta funcion el controlar el subsistema DB2. Normalmente esta funcion no existe al inicio, y entonces es compartida por el Administrador de la Base de Datos y el Programador del Sistema. Las responsabilidades que incluye son: * Definir el entorno de operacion (hw. y sw.). * Definir las opciones iniciales de instalacion. * Suministrar la guia de funcionamiento al programador del sistema y al operador. * Suministrar informacion a la funcion de planificacion de capacidad. * Establecer directrices de backup y recuperacion. * Controlar y perfeccionar el funcionamiento del subsistema DB2. * Participar en las revisiones de diseo. * Realizar diagnostico de errores,tanto del sistema como de aplicaiones.

* Establecer directrices para el uso de las funciones de seguridad del subsistema DB2 y coordinar su uso con la funcion de seguridad de la organizacion de administracion.

PROGRAMADOR DEL SISTEMA DB2 ___________________________

Esta funcion es similar a la tradicional de programador del sistema, en lo que se refiere al entorno DB2 incluye:

44

* Instalacion de los productos prerrequisito. * Instalacion de DB2 y otros productos relacionados. * Implementar procedimientos para la determinacion de problemas. * Aplicar mantenimiento de sw. * Ejecutar las herramientas de medicion de rendimiento y control, suministrando la informacion a las funciones de

ADMINISTRACION DEL SUBSISTEMA DB2 Y DE PLANIFICACION DE CAPACIDAD. * Implementar procedimiento de backup y recovery. * Suministrar autorizacion inicial. * Desarrollar procedimientos de operacion y entrenamiento de operadores.

OPERACION DEL SYSTEMA DB2 _________________________

Esta responsabilidad incluye: * Arrancar, parar y controlar el subsistema DB2. * Controlar los mensajes del DB2 y tomar las acciones pertientes. * Comunicacion con los demas operadores del sistema ( CICS, TP).

ANALISIS DE APLICACIONES ________________________

Esta funcion tiene la responsabilidad de determinar y documentar los requerimientos de la aplicacion, incluyendo la definicion de las relaciones entre los datos y los modelos de uso. En concreto, esta responsabilidad incluye: * Definicion de los requerimientos de la aplicacion. * Definicion de las relaciones entre datos y modelos usados * Desarrollo del diseo logico de la aplicacion. * Definir las especificaciones de los programas.

45

* Coordinar las revisiones del diseo. * Coordinar las pruebas integradas de programas.

PROGRAMACION DE APLICACIONES ____________________________

Esta funcion es responsable del desarrollo de programas e incluye:

* Codificar y probar programas. * Implementar las reglas de integridad de datos. * Codificar rutinas comunes, tales como rutinas de salida, codigos de retorno del SQL,puntos de control logicos,etc. * Creacion y carga de datos de prueba en tablas. * Participar en las revisiones del diseo y planificacion de pruebas. * Desarrollar procedimientos de backup y recuperacion para la aplicacion.

SOPORTE DE CENTRO DE INFORMACION ________________________________

El requerimiento de esta funcion surgira si se van a utilizar herramientas orientadas a usuarios finales, tales como QMF o AS. Las responsabilidades que incluye esta funcion son: * Aadir nuevos usuarios y mantener sus profiles. * Soporte de consultas a usuarios finales. * Asistir a los usuarios en la localizacion y acceso de los datos que requieren.

* Controlar el uso de disco por los usuarios finales. * Desarrollo de consultas comunes y complejas.

46

REPRESENTANTES DE LOS USUARIOS ______________________________

Las responsabilidades iniciales de los usuarios son: * Asesoramiento en la identificacion y definicion de las entidades de la empresa y de sus procesos. * Definicion de las reglas de integridad. * Definicion de los objetivos de seguridad, disponibilidad y rendimiento.

* Pudiendo tambien involucrarse en la fase de desarrollo de la aplicacion,para facilitar la creacion de prototipos de cons4 e informes. En una fase inicial, las funciones de ADMINISTRACION DE DATOS Y ADMINISTRACION DE BASES DE DATOS, pueden ser asumidas por una sola persona. Igualmente que en el caso anterior, las funcioones de PROGRAMACION DEL SISTEMA DB2 y ADMINISTRACION DEL SISTEMA DB2, pueden ser tambien asumidas por una sola persona.

MACRO ACTIVIDADES A DESARROLLAR EN UN PROYECTO ______________________________________________

|Gestion de Proyecto. PLANIFICACION|Seleccionar la aplicacion piloto. |Definicion de estandares. |Identificar los recursos a proteger.

|Definir el entorno de software. |Verificar requerimientos hw. HW/SW INSTAL.|Verificar requerimiento sw. |Determinar las opciones de instal. del DB2 |Instalar DB2.

|Preparacion del entorno. |Desarrollar rutinas y proc. comunes. DISEO Y |Analisis de la aplicacion. DESARROLLO |Diseo de Bases de Datos. APLICACION |Desarrollo de programas y prueba. |Paso de desarrollo a produccion.

47

|Procedimientos de arranque y parada. |Definir procedim. Backup y Recovery. OPERACION Y |Preparar procedim. de control. RECUPERACION |Desarrollar proced. recovery y backup sis. |Desarrollar proced. backup y recovery de | aplicaciones.

|Estrategia de desarrollo. GESTION RDTO |Definir entorno de herramientas. |Analizar y refinar. |

De la lista de actividades expuesta, como se observa existen algunas que solo es necesario realizarlas una vez, otras que habra que realizarlas ciclicamente y finalmente aquellas que son propias de cada aplicacion a desarrollar.

Del conjunto de funciones expuestas, sera necesario asignarlas a personas que formen parte del Proyecto y que al menos seran: * Una persona como Administrados de Base de Datos y Administrador de Datos. * Dos analistas de aplicaciones, uno actuando como lider del proyecto. * Dos o mas programadores de aplicaciones. * Una persona, con el papel de Programador del Sistema y Administrador de Datos del Sistema.

PLANIFICACION. _______________

1.-Gestion del Proyecto. Consistira en el desarrollo de la planificacion del Proyecto , definiendo la duracion de cada una de las tareas y la dedicacion a ellas de los recursos del equipo, que en algunos casos no sera del 100%. I5 Planificacion de la formacion y entrenamiento de los diferentes miembros del equipo.

2.-Seleccion de la aplicacion piloto.

En la que participaran el administrador de la base de datos y analista de aplicaciones.

48

Debera ser una aplicacion de bajo riesgo, que tenga un amplio espectro de aplicacion de herramientas, como simulacion completa y no compleja ademas de facil de demostrar a los usuarios finales.

3.-Definicion de Estandares. Participaran en administrador de base de datos, el administrador de datos, el programador del sistema y el analista de la aplicacion. Su actividad consistira en : a) Denominacion de los objetos DB2, programas, copys, transacciones, usuarios, jobs. b) Directrices para el diseo de tablas y de la aplicacion.

c) Directrices para la programacion de la aplicacion. d) Directrices de documentacion. e) Procedimientos especificos de instalacion.

4.-Identificar los recursos a proteger. Definir un entorno de acceso limitado de datos y de autorizaciones y responder a los requerimientos de auditoria. Ser responsable el administrador del sistema, y aquel personal que tenga la responsabilidad de mantener el entorno de seguridad. Ademas participarna el administrador de bases de datos y analista de aplicaciones. Las tareas a realizar son: * Definir los objetivos de seguridad. * Identificar los recursos a proteger. * Establecer los grupos de autorizacion.

DISEO Y DESARROLLO DE LA APLICACION ____________________________________

1.-Establecer el entorno de desarrollo de la aplicacion.

Consistira en preparar el entorno de trabajo del programador de aplicaciones, en cuya actividad participara el

49

administrador del sistema y el administrador de bases de datos. El entorno de trabajo estara integrado por librerias, procedimientos (jcls, utilidades, etc.) y rutinas comunes ( verificacion SQLCA, frecuencia de puntos de control,etc).

2.-Analisis de aplicaciones. Consistira en la eleccion y aplicacion de una metodologia por parte de los analistas de aplicaciones, para las tareas de: * Definicion de requerimientos. * Diseo externo. * Modelo logico de datos. * Diseo interno. Actividades importantes, integradas en las sealadas,

son: - ANALISIS DE DATOS. - DESARROLLAR PROTOTIPOS FUNCIONALES ( QMF, CSP, SQL ). - DIRECTRICES PARA EL DISEO DE APLICACIONES.

3.-Diseo de Base de Datos. Tarea a realizar por el administrador de base de datos, con la colaboracion del analista de aplicaciones.

4.-Desarrollo y prueba de programas. Consistira basicamente en la codificacion y prueba de los programas de la aplicacion, el responsable directo ser el programador de aplicaciones y tambien participara el analista de aplicaciones el el administrador de base de datos. Las tareas a realizar son: * Crear datos de prueba. * probar las llamadas SQL. * Desarrollar los programas. * Prueba unitaria.

* prueba integrada.

50

5.-Paso de Desarrollo a Produccion. El responsable ser el lider del projecto y participara todo el equipo en esta actividad, cyuas tareas mas importantes son: * Desarrollar el plan de migracion. * Revisar el rendimiento de la aplicacion. * Obtener el espacio en disco de produccion. * Informar al personal de produccion de la carga esperada. * Desarrollar una lista de puntos claves para el manejo de problemas. * Mover definiciones de bases de datos (DDL). * Crear librerias y mover programas de aplicacion. * Realizar la integracion de las tareas en CICS, TSO.

* Cargar nuevos datos. * Nuevos usuarios. * Establecer autorizaciones. * Ejecutar RUNSTATS. * Preprocesar, compilar, link y bind de programas. * Pasar el EXPLAIN a todos los planes y verificar que se usan los caminos esperados. * Establecer procedimientos de contabilidad. El DB2 suministra rutinas de servicio llamadas attachement facilities que conectan el programa de aplicacion al DB2 para permitir usar sus servicios. El comando DSN y sus interfases asociadas, DSNELI (para TSO o Batch ), DSNCLI ( para CICS ) , son las facilidades standard de conexion al DB2. Por tanto cualquier programa de aplicacion es

totalmente dependiente de la conexion al DB2. Por ejemplo, no se pueden cambiar los nombres de planes, antes de finalizar la aplicacion. Si el DB2 termina, tambien terminar la aplicacion.

51

DISEO DE BASES DE DATOS ________________________

INTRODUCCION.______________

En el proceso de diseo de bases de datos, deber a haber una primera fase de diseo en la que se definiese la Arquitectura de datos o Modelo de datos corporativo, que represente de forma general a la entidad, sin entrar en detalles, simplemente a nivel de U Grupos de Datos y las Relaciones entre estos U ( un empleado, un departamento, un cliente, un prestamo, etc.), lo cual supondra el inicio del diseo del Sistema de Informacion de la entidad. Una vez cubierta la fase anterior, se iniciara el proceso de analisis de cada una de las aplicaciones o subsistemas definidos en el Sistema de Informacion, y por consiguiente al analisis de los datos propios de la aplicacion, definiendo entonces el contenido de pantallas, informes y otros ficheros que requiera el usuario.

DISEO LOGICO DE BASES DE DATOS _______________________________

A)ANALISIS DE DATOS. ____________________

1)Establecer normas de denominacion de los datos para evitar sinonimos(elementos con diferente nombre y mismo significado) y homonimos (elementos con el mismo nombre y diferente significado).

2)Durante la elaboracion del modelo de datos, nuevas U entidades U se crearan siempre que dos entidades se U relacionen U en una forma varios a varios. Un ejemplo podra ser que un cliente ha prestado varios avales y que un aval ha sido hecho por varios clientes. Lo cual nos llevara a aconsejar la creacion de una ta bla extra de Avales/clientes. En esta fase se definiran tambien los atributos de las relaciones y de las entidades. En consecuencia los diferentes items de datos que integran una entidad y mediante que claves y tipos de las mismas estableceremos las relaciones entre las diferentes entidades.

52

3)En la teoria relacional, clave primaria o candidata no implica camino de acceso o secuencia.

4)Foreign keys son frecuentemente buenas candidatas para el rendimiento de indices. (se puede usar en joins). Las Foreign Keys son las llamadas claves ajenas, es decir columna(s) de una entidad que es clave primaria en otra. Siendo muchas veces claves candidatas en la primera.

5)Un Clustering index es aquel que determina el orden fisico de las filas de una tabla.

B)NORMALIZACION _______________

Una vez realizado el analisis de datos, se procedera a normalizar las entidades (tablas) en tercera forma normal.

1)Primera forma normal. Consiste en la eliminacion de los campos repetitivos mediante la creacion de una nueva entidad. La cual incluye una Foreign Key en la nueva entidad, para asi poder realizar JOIN con las dos entidades. La importancia de esta normalizacion, viene dada

fundamentalmente por la eliminacion de campos repetidos que dara lugar a un no deseado mantenimiento de los campos implicados.

2)Segunda forma normal. Consiste en determinar que datos elementales son dependientes de campos de clave no primaria. Una nueva entidad se creara con estos campos, incluyendo tambien una foreign key en la nueva entidad, para asi poder hacer join con las dos.

3)Tercera forma normal. Consiste en determinar que datos elementales son dependientes de solamente una parte de la clave primaria. Una nueva entidad se creara con estos campos, incluyendo una foreign key en la nueva entidad, para asi poder hacer join con las dos entidades. La importancia de la normalizacion en segunda y tercera forma normal, consiste en evitar anomalias de actualizacion ( en especial en lo que se refiere a la integridad de datos, tal como borrado desintencionado de registros ). Si una tabla contiene campos no dependientes de la clave primaria completa, entonces podran darse anomalias en la actualizacion.

53

C)INTEGRIDAD REFERENCIAL ________________________

La integridad referencial puede ser definida como: * Siempre que se necesita cambiar una tabla (insertar, actualizar, borrar), que condiciones deben existir en las otras tablas?. * Siempre que se modifica una tablas, que otras tablas deben ser cambiadas?. Estos aspectos afectan al desarrollo, a la planificacion de la recuperacion, etc.

NOTA: En la version 2 del DB2, la integridad referencial es una funcion del DB2, la cual asegura la validacion de las relaciones entre una y otra tabla. Se pueden definir criterios referenciales, por ejemplo el que un empleado no pueda ser dado de alta en una departamento si este no existe. Tambien que una fila de una tabla de departamentos no puede ser borrada, mientras existan empleados asignados a ese departamento, etc.

INTEGRIDAD DE DATOS: _____________________

1.-UN ADECUADO DISEO DE BASE DE DATOS. _______________________________________

* ANALISIS TOTAL DE LOS DATOS. Todos los campos que son necesarios y no derivables, se almacenaran en una tabla.

* NORMALIZACION DE LOS DATOS, PARA EVITAR: Restricciones artificiales en la aplicacion. Almacenamiento redundante de datos. (excepto para Foreign Keys). Cualquier posible anomalia en la actualizacion.

54

2.-UN ADECUADO DISEO DE MODULOS, CODIFICACION Y PRUEBAS. _________________________________________________________

* Implementar las reglas de integridad referencial definidas al disear las bases de datos. * Definir e implementar las unidades logicas de trabajo.(LUW) Para en cada una de ellas poder establecer los puntos de Commit en los programas batch o de Sync en los interactivos. Esto es un aspecto importante en cuanto a integridad y rendimiento. -Una orientacion en programas interactivos puede ser: Disear la aplicacion de tal modo que una LUW se corresponda con cada pantalla que se visualiza. Siempre que haya un CICS RETURN supone un Sync implicito. Evitar cancelaciones, de tal forma que cualquier codigo de retorno imprevisto, suponga un rollback y mensajes al usuario, ademas de escribir la SQLCA en un fichero de errores. Una LUW se corresponde con el uso de un thread, cuyo tiempo debe minimizarse, por cuanto supone asignar recursos ( plan, DBDs, espacio de tablas, indices );

por ello el thread debe procurar liberarse cuando se dialoga con el terminal. Debe tambien recordarse que el Rollback actua desde el ultimo commit o sync. -Una orientacion en programas batch puede ser: En programas de significada actividad de actualizacion ser necesario usar Commit y prever restauracion logica. Las Commit deberan hacerse cada cierto numero de LUW, en base a cuantos bloqueos puede tener el IRLM ( esto es aplicable a bloqueos de paginas o tambien cada 10 o 15 minutos. No olvidar que todo programa batch que realice Commit periodicos debe tener restauracion logica o debe poder volver a ser ejecutado sin afectar a la integridad de los datos.

55

RENDIMIENTO Y CONCURRENCIA EN BASE DE DATOS ___________________________________________

ALGUNOS DE LOS FACTORES CLAVES SON : ____________________________________

A)CONCURRENCIA. ______________

* Esperas por liberacion de bloqueos pueden esconder la causa de un lento rendimiento. * Pueden producirse fallos del SQL debido a que se sobrepasa el numero de bloqueos concurrentes del IRLM o debido a un lock timeout o a un deadlock.

B)TRABAJO REALIZADO POR EL DB2 PARA EL SQL. ___________________________________________

* El factor clave consiste en el numero de paginas que son leidas y/o escritas por el DB2,lo cual es funcion del plan de acceso y la cardinalidad de las columnas. -Informacion sobre la cardinalidad de las columnas esta disponible en el Catalogo del DB2 ( en SYSIBM.SYSCOLUMNS.COLCARD), para columnas que son la primera de un indice. Informacion sobre la cardinalidad de indices completos tambien esta disponible en el Catalogo del DB2 (tabla SYSIBM.SYSINDEXES, columnas FIRSTKEYCARD Y FULLKEYCARD. -Informacion sobre el plan de acceso esta disponible va DB2 EXPLAIN. Se puede usar para una sentencia SQL o para

una Plan completo. Esta informacion incluye: Secuencia en la que los conjuntos (query-blocks) de sentencias son procesadas. (ejemplos de sentencias SQL que tiene varios query-blocks son subselects, UNIONs y JOINs). Secuencia de acciones dentro de un query-block. Si se esta usando un indice. (se suministra el nombre) Como se esta usando un indice (MATCHCOLS=0 indicara busqueda por indice con mucho tiempo de ejecucion).

56

Si hay bloqueo a nivel de pagina o espacio de tabla. (TSLOCKMODE). Cuando es igual a X o S reducira la concurrencia. Si se hace clasificacion y porque. (hay ocho columnas de indicador de sort). * LOS SIGUIENTES ASPECTOS AFECTAN A LA ELECCION DE UN PLAN

DE ACCESO DEL DB2. La consulta. Los indices definidos. Los parametros DDL. (ejemplo locksize). Los parametros bind. (ejemplo isolation). Las estadisticas en el DB2 para el espacio de tablas, la tablas y los indices, incluyendo: -Tamao de la tabla. -Cardinalidad de los indices.Indices con pocos valores distintos son menos usados por el DB2. -Como esta organizado el espacio de

tablas.(clustered?). -Como estan organizados los indices, -Cual es el nivel de actualidad de las estadisticas respecto al estado actual de los datos(RUNSTATS). * DEFINIR SOLAMENTE LOS INDICES IDONEOS (UTILES), LOS EXTRA DEGRADAN PROGRAMAS DE USUARIO Y DE UTILIDAD. * TABLAS E INDICES BIEN ORGANIZADOS REDUCEN I/Os. El catalogo del DB2 nos informa de este nivel de

organizacion. * IMPRESCINDIBLE EL USO DE PROTOTIPOS.

DISEO FISICO DE BASES DE DATOS ________________________________

A continuacion vamos a ofrecer una serie de recomendaciones en la definicion de los diferentes objetos del DB2: Grupos de almacenamiento, Bases de datos, Espacios de tablas, Tablas, Indices y Vistas.

57

1)Si las tablas usan muy frecuentemente el JOIN, habra que considerar la posibilidad de desnormalizar las tablas, almacenando los datos duplicados para evitar la necesidad del JOIN. Habra que analizar el equilibrio entre el incremento del coste del JOIN y el incremento del coste de mantenimiento de datos duplicados.

2)Aconsejar el uso de NOT NULL en las columnas, a no ser que exista requerimiento por parte de la aplicacion. Cada

columna nula afecta negativamente al rendimiento y requiere un byte extra por fila y ademas complican la logica del programa, que debe verificar las nulas,

3)Colocar las columnas VARCHAR al final de la tabla. Este tipo de columnas solo se definiran, cuando la variabilidad del tamao sea significativo, unos 20 bytes de media.

4)El usar ficheros Vsam definidos por el usuario, en lugar de la definicion de grupos de almacenamiento, da mayor flexibilidad en la operacion. Permitiendonos incrementar espacios de tablas o indices y/o mover un fichero DB2 sin tener que hacer descarga, borrado, y carga de la tabla. se podra usar el REORG con UNLOAD o DSN1COPY para cambiar de lugar ficheros DB2).

5)Limitar el nombre de indice a ocho caracteres, para poder usar el mismo nombre cuando se usen grupos de almacenamiento o se definan ficheros DB2.

6)Asignar un prefijo a los objetos DB2 por cada aplicacion, para facilitar las consultas al catalogo del DB2.

7)Se aconseja una tabla por espacio de tablas.

8)Usar LOCKSIZE TABLESPACE:

Cuando una tabla es accedida en modo de solo lectura. Cuando un solo usuario la actualiza. (ej. programa batch). Recordar que este atributo se puede modificar antes y despues de ejecutar un programa mediante el bind. Otra solucion sera codificar LOCK TABLE en el programa. En este caso tambien es aconsejable usar SUBPAGES = 1 en los indices.

58

9)Usar LOCKSIZE ANY cuando se ha decidido bloqueo de pagina. En este caso el DB2 actua de la siguiente manera: * En el momento del BIND el DB2 elige normalmente bloqueo de pagina, a excepcion de que ISOLATION = rr y scan de la tabla se realize. * Durante la ejecucion el DB2 escalara el bloque a nivel de tabla si, y solamente si, el numero de paginas actualmente bloqueadas en la tabla exceda al numero especificado como limite en NUMLKTS. En este caso subpages debe ser > 1 , en base al nivel de

actividad y al tamao de la tabla.

10)Usar CLOSE = NO a no ser que el fichero se use muy poco.

11)Todos los accesos a los datos deben de realizarse siempre a traves de VISTAS, nunca a traves de las tablas base. Incluso en el supuesto de que la VISTA sea igual a la tabla. Tambien conviene definir sinonimos para cada vista, de tal forma que los accesos sean independientes del creador de la tabla o vista.Otras ventajas son: * Incrementa la flexibilidad de la autorizacion : Los usuarios de la vista tendran acceso solamente a las columnas de la vista. * Incrementa la simplicidad de las sentencias SQL: Limitando el acceso al conjunto de filas y columnas que integran la vista. * Incrementa el control sobre los programas y sus accesos a los datos. ( SELECT USER FROM SYSAPPL.USERVIEW )

12)Antes de cargar los datos crear siempre primero los indices.

13)Considerar el particionar grandes tablas. La eleccion del numero de particiones sera en base al tamao de la tabla, el numero de indices, la configuracion de los discos y la

planificacion de utilidades. * Facilita el REORG , COPY y RECOVER por particion. * Facilita el reducir de tamao los ficheros del DB2. * Un aspecto importante es en que medida es particionable la clave del cluster. Puede ocurrir que la naturaleza de los datos dificulten una buena o aceptable distribucion de las particiones. En caso de que la clave primaria la

59

consideremos como no particionable, las soluciones son: -Tener una gran tabla. -Crear multiples tablas. -Definir otro indice primario que facilite la particion. * En general evitar tener tablas o particiones mayores al 35% del disco.

14)Normalmente usar solo PCTFREE, para establecer el espacio libre.

15)En tablas pequeas considerar espacio libre extra, para reducir la contencion. Consideraciones generales entorno al espacio libre son las siguientes: * A mayor espacio libre: -menor frecuencia de Reorganizacion. -menor contencion. -incremento del tiempo de ejecucion de los programas de ut. -incremento de I/O de una sentencia SQL que acceda a multiples filas. -mayor ocupacion de disco.

16)Aspectos generales de almacenamiento, que pueden afectar al rendimiento. * En tablas de acceso muy frecuente, procurar colocarlas en los discos mas rapidos y en los de cabecera. * La anterior recomendacion aplicarla al Catalogo y al Directorio del DB2. * Igualmente con lo referente a los espacios de tablas temporales del DB2. (usadas en join, subselect, order by,..). * Procurar evitar el uso de espacio secundario en datos e

indices, ajustando adecuadamente el tamao de las tablas. El uso de espacios secundarios degrada el rendimiento. * Cuando se usen grupos de almacenamiento, asignar un solo volumen a cada grupo. Facilitara el control. * Evitar usar mas del 75% de cada volumen.

60

SELECCION DE INDICES ____________________

La seleccion de indices es uno de los aspectos mas importantes en el diseo, siendo la mas notable consecuencia el rendimiento, ademas de permitirnos forzar la unicidad de registros en donde la clave sea unica.

1)Cuando para una tabla se defina mas de un indice, definir de forma explicita el indice cluster. Debiendo ser aquel bajo cuyo criterio es normalmente procesado el conjunto de datos.

2)Evitar indices que empiecen por la misma columna, con la excepcion de que las pruebas demuestren una utilidad importante.

3)En indices de multiples columnas, la secuencia de las columnas es un aspecto muy importante, especialmente en lo que se refiere a la primera columna. Todo ello es critico en la seleccion del camino de acceso y por tanto en el rendimiento. Consultar manual GG24-3004.

4)Es necesario analizar la relacion coste-beneficio existente en cada indice candidato, antes de decidir su utilizacion. * Los costes aumentan : -Al realizar inserciones, actualizacion. -Al procesar utilidades (LOAD, REORG, CHECK y RUNSTATS). * Los beneficios son: -Muy limitados si el DB2 tiene ya un indice alternativo que le permitira realizar de forma eficiente la sentencia SQL. -Reduccion del tiempo de acceso a los datos. -Reduccion del tiempo de proceso, al poder realizar funciones sin tener que hacer una clasificacion previa. borrados e incluso

5)Una vez cargadas las tablas, realizado el RUNSTATS y hecho el bound de los planes de la aplicacion, se debe analizar que los indices definidos estan siendo usados eficientemente y determinar las causas de situaciones diferentes, para poder decidir si es necesario anular o crear otros indices.

61

Para ello es necesario trabajar sobre un entorno de tablas muy similar al que vaya a darse en produccion. * Consultar las tablas de SYSINDEXES Y SYSCOLUMNS, para : -analizar en que medida un indice es unico o no. -que indices no estan siendo usados por las sql estaticas. -si un indice no es usado, puede ser debido a unas sql defectuosas o que sobra el indice. -para las sql dinamicas hacer un seguimiento con el Explain.

DISEO, CODIFICACION Y PRUEBA DE APLICACIONES

_____________________________________________

ACCESO DE DATOS _______________

Hemos sealado anteriormente que los programas y consultas almacenadas, accederan siempre a las tablas atraves de VISTAS , lo cual hace que las sentencias sql sean independientes del creador de las tablas y de los cambios de las mismas. Otros aspectos importantes a tener en cuenta son:

1)Evitar que en las clausulas WHERE se den las siguientes condiciones: -Forzar hacer la conversion numerica para columnas numericas. Para ello se deben hacer las variables o literales host, del mismo tipo de datos, precision y escala. -Especificar una serie de caracteres mayor que la longitud de la columna. Procurar siempre que la variable o literal sea menor o igual en tamao. -Codificar argumentos de busqueda que constituyan predicados que el DB2 no pueda decidir su uso contra los indices. Estos aspectos son ampliamente analizados en GG24-3004.

2)Si hay varias tecnicas para codificar una sentencia SQL, analizar cual de ellas es la mas eficiente.

62

3)Algunas tecnicas que ayudan a elegir el mejor camino de acceso son: a)Si se va a actualizar una columna de un indice, entonces este indice no se considerara por el DB2 en sus criterios de busqueda. El procedimiento aconsejable sera: 1)DECLARE y OPEN, una SELECT con el criterio de actualizar. 2)FETCH a fila ( proxima). 3)Cambiar el valor de la columna en el programa. 4)DELETE de fila usando la clave primaria unica. 5)Re-Insertar la fila con el nuevo valor de la columna. 6)Repetir los pasos 2-5 para continuar actualizando filas.

4)Siempre que sea posible usar JOINs en lugar de Subquerys. Prototipo previo.

5)Evitar el uso del operando OR, a no ser que cada predicado se refiera a la misma columna y el operador de comparacion sea =. -Una alternativa al OR es UNION. Tener en cuenta que esta opcion no presenta registros duplicados.

6)Si en el acceso a grandes volumenes de informacion se le obliga al DB2 a hacer Sort interno, porque no disponga en ese acceso de un indice ( casos de JOIN, ORDER BY, GROUP BY, DISTINCT), entonces valorar el hacer un DFSORT.

DESARROLLO Y PRUEBA DE PROGRAMAS ________________________________

1)Fase de prueba unitaria.

Cada desarrollador debe responsabilizarse de precompilar, compilar, linkeditar y hacer bind de sus programas, ademas de disponer de sus tablas de prueba, para lo cual cada uno podra tener su propia base de datos y grupos de almacenamiento. Todo ello reducira ademas la contencion

en el catalogo del DB2.

63

2)Fase de Prueba de la aplicacion. -

Primero se debe determinar que usuario hace la precompilacion, compilacion, linkedita y bind, evitando as el que si otro usuario hace el bind del plan, el original pierda la autoridad sobre el mismo. Determinar que ficheros se utilizaran en las pruebas para : -codigo fuente. -DBRM. -Modulos. -JCLs. Prever un mecanismo para determinar que planes deben ser rebound, cuando un programa se modifica. ( tabla del catalogo : SYSIBM.SYSDBRM ).

| Programa | Fuente | v | Traductor | v | Precompilador | DB2 | | v | DBRM | v | BIND | v | PLAN | | | | linkaje | | | v | | |

| Comandos Cics

| Compilador | | Cobol |

v |

v | modulo |

El Plan se almacena una tabla del catalogo del DB2, y es consecuencia de las sentencias SQL, de las definiciones de las tablas e indices sobre las que actua, etc., con objeto de optimizar el camino de acceso a los datos.

64

GESTION DE CAMBIOS EN BD ________________________

Por cambios en : -Tablas y/o vistas (DROP, CREATE, ALTER). -Adicion o baja de indices. -Cambios en el espacio de tablas (ALTER).

A)Si una tabla y/o indice se crea y se carga con datos, de inmediato se debe: 1)RUNSTATS sobre los objetos afectados. 2)Todos los planes afectados por los cambios deben ser rebound.

B)Si se crea una nueva tabla y/o vista o dropped, y recreada. Entonces se debe de hacer inmediatamente:

1)Hacer un re-GRANT de autorizacion para la tabla y/o vista. 2)Avisar a los usuarios afectados para re-CREATE sus sinonimos para la tabla y/o vista. 3)Todos los planes afectados por el cambio debe ser rebound. (*). (*) Tambien despues de ALTER una tabla, un espacio de tablas o indice y despues de DROP de un indice.

OPTIMIZACION DEL BIND ______________________

1)Se hara un REBIND de un plan siempre que se desee que el DB2 vuelva a determinar sus caminos de acceso. Algunos casos son: -Despues de crear un indice para una tabla que ya tenia datos.( CREATE > RUNSTATS > REBIND ). -Despues de ALTER un espacio de tablas, tabla o indice. -En la mayoria de los casos, despues de un RUNSTATS. -Despues de cambios significativos en los datos: REORG > RUNSTATS > REBIND

65

2)Para reducir el numero de bloqueos de paginas, hacer BIND con ISOLATION = CS (cursor stability, es aconsejable desde un punto de vista de concurrencia, si se va a acceder una sola vez a una fila en una transaccion, pero si se accede a la misma file varias veces no se garantiza consistencia, por tanto cuando existen razones de integridad se requiera ISOLATION = RR (lectura repetible).

3)Para mejorar el rendimiento : (DEALLOCATE)

BIND con RELEASE

Para mejorar la concurrencia BIND con RELEASE (COMMIT). Nota: En la preparacion de esta primera parte se ha utilizado, basicamente, el GG24-3004-00 IBM DATABASE 2 APPLICATION DESIGN AND TUNING GUIDE, el SC26-4130-2 Development Guide y la publicacion DB2 APPLICATION DEVELOPMENT RECOMMENDATIONS.

NUEVAS FUNCIONES Y MEJORAS DEL DB2 R3 _____________________________________

Resumimos en este apartado las mejoras que se referencian en el manual GG24-3182 : IBM DATABASE 2 RELEASE 3 NOTEBOOK. En el citado manual existen tambien ejemplos sobre la aplicacion de las mejoras aportadas por el DB2 R3.

1.-MEJORAS EN EL LENGUAJE SQL:

A)Funciones escalares para: * Convertir valores de un tipo de datos a otro. * Extraer sub-series de series. * Sustituir valores NULL en busqueda de datos, por otro valor especificado por el usuario, Las nuevas funciones escalares son: DECIMAL, DIGITS, FLOAT, HEX, INTEGER, LENGTH, SUBSTR, VALUE Y VARGRAPHIC. Las anteriores funciones : MAX, MIN, COUNT, AVG y SUM, ahora se denomina funciones de columna.

B)Nuevo operador de concatenacion para series.

66

C)Mejoras en el operador UNION: * UNION ALL para retener valores duplicados. * Eliminacion de restricciones del UNION.

D)Eliminacion de algunas restricciones en : * Operador UNION ALL. * Operador LIKE. * INSERT con subselect. * Clausula SET de la sentencia UPDATE SQL.

E)Posibilidad de manejar los errores de division por cero y otras operaciones de conversion y aritmeticas invalidas.

F)Nuevos tipos de datos : DATE, TIME y TIMESTAMP.

G)Nuevos tipos de datos para numeros de simple precision y coma flotante.

H)Eliminacion de algunas restricciones de las VIEW.

2.-MEJORAS EN LA OPERACION.

A)Soporte DL/I Batch.

B)Mejoras en programas de utilidad: * LOAD REPLACE de una particion. Antes solo era posible a nivel de espacio de tablas. * MODIFY . (*) , que permite a un usuario borrar todas las entradas en SYSIBM.SYSCOPY, de un espacio de tablas, particion o fichero. * RECOVERY INDEX que permite recuperar de una pasada una lista de indices o todos los indices de un espacio de tablas.

67

* RUNSTATS mejorado, al recojer mejores estadisticas para incrementar el rendimiento de las sentencias SQL.

3.-MEJORAS DE RENDIMIENTOS.

A)En los programas de utilidad reseados.

B)en UNION ALL.

C)En : * Evitar sort innecesarios en ORDER BY y GROUP BY. * Clasifica el resultado de una IN subquery.

68

_____________________________________________________________________ _____________________________________________________________________

DB2. ____

NO SE DEBEN UTILIZAR VARIABLES DEFINIDAS EN NIVEL 01 DE LA FD PARA CONDICIONES DE BUSQUEDA DEL DB2. LAS VARIABLES DE LA CLAUSULA WHERE HAN DE ESTAR DEFINIDAS EN LA WORKING, PARA GARANTIZAR UN RESULATADO OPTIMO.

_____________________________________________________________________ _____________________________________________________________________

You might also like